Xcode:“ ไม่สามารถเข้าถึงฉากได้เนื่องจากไม่มีจุดเข้า” แต่หาไม่พบ


89

Xcode 4.5.2 ให้คำเตือนต่อไปนี้แก่ฉัน:

Unsupported Configuration    
Scene is unreachable due to lack of entry points and does not have an identifier 
for runtime access via -instantiateViewControllerWithIdentifier:.

น่าเสียดายที่ฉันไม่สามารถระบุฉากที่ถูกกล่าวหาได้ การเลือกคำเตือนในตัวนำทางปัญหาไม่ได้เน้นอะไรใน Storyboard ฉันมีสตอรี่บอร์ดที่ค่อนข้างซับซ้อน (30+ ฉาก)

ข้อเสนอแนะใด ๆ ?

ภาพหน้าจอสำหรับคำเตือน

คำตอบ:


50

แม้ว่าเธรดนี้จะเก่า แต่ฉันไม่เห็นคำตอบที่อธิบายว่าอะไรเหมาะกับฉันดังนั้นต่อไปนี้ ...

ฉันมีข้อผิดพลาดนี้และการตรวจสอบภาพของกระดานเรื่องราวแสดงให้เห็นว่าตัวควบคุมมุมมองทั้งหมดดูเหมือนจะเชื่อมต่อกับตัวควบคุมมุมมองรูท

ฉันลองตั้งชื่อตัวควบคุมมุมมองทั้ง 17 ตัวในสตอรี่บอร์ด (ตามคำตอบของ @bobnoble) ฉันใช้หลักการตั้งชื่อตามชื่อแบบยาวของตัวควบคุมมุมมองเช่น "jvc" สำหรับ "Jobs View Controller" เมื่อฉันพยายามสร้างฉันได้รับข้อความแสดงข้อผิดพลาดที่ชี้ไปที่ตัวควบคุมมุมมองตัวใดตัวหนึ่งว่ามีชื่อซ้ำกัน การติดตามสิ่งต่าง ๆ ฉันพบว่าฉันมีตัวควบคุมมุมมองที่ซ้ำกันจริงๆซึ่งซ้อนอยู่ด้านบนของคู่แฝด ฉันสงสัยว่ามันเป็นความเสียหายแบบตัดแล้ววางจากการทดลองอินเทอร์เฟซผู้ใช้ซึ่งฉันไม่ได้ถอยออกมาอย่างสมบูรณ์

อย่างไรก็ตามการลบคู่แฝดที่ไม่ได้เชื่อมต่อช่วยแก้ปัญหาของฉันได้ หลังจากนั้นฉันก็ลบชื่อ VC ทั้งหมดออกเนื่องจากไม่มีการอ้างอิงในโค้ด


3
สิ่งนี้ก็เกิดขึ้นกับฉันเช่นกัน แต่ฉันยังต้องเติมหนึ่งในจำนวนที่ว่างเปล่าStoryboard ID
ปิแอร์เดอเลสปิเนย์

... ถ้าอย่างนั้นฉันเชื่อว่า @bobnoble เป็นคำตอบที่ถูกต้องที่มีเครื่องหมาย√
SwiftArchitect

139

ในกระดานเรื่องราวของคุณให้เลือกตัวควบคุมมุมมองแต่ละตัว (ลูกศรสีแดงในภาพด้านล่าง) และดูที่ช่องรหัสเรื่องราว (วงรีสีแดง) ไม่ควรเว้นช่อง ID Storyboard ว่างไว้ เมื่อคุณพบสิ่งที่เป็นนั่นคือผู้ร้าย

ป้อนคำอธิบายภาพที่นี่


6
สวัสดี @bobnoble ขอบคุณสำหรับการตอบกลับของคุณ คำถามหนึ่ง: เหตุใดฉันจึงควรตั้งค่า Storyboard ID สำหรับทุกฉาก ฉันไม่คิดว่ามันบังคับใช่มั้ย? ฉันรู้ว่าฉันต้องตั้งค่า ID หากฉันต้องการเข้าถึงฉากด้วยโปรแกรม แต่จะเกิดอะไรขึ้นถ้าฉากทั้งหมดของฉันเชื่อมต่อผ่านฉากต่างๆ? หรือเป็นเพียงการฝึกเขียนโปรแกรมที่ดี?
Wolfy

@ Wolfy - จุดที่ดีคุณต้องดูแต่ละอันเพื่อให้แน่ใจว่ามีทั้ง segue หรือ Storyboard ID
bobnoble

2
ลองใช้วิธีแก้ปัญหานี้ฉันตระหนักว่าการกรอกStoryboard IDคำเตือนเฉพาะรายการเดียวเท่านั้นที่ลบคำเตือนออก
Pierre de LESPINAY

ฉันมีUINavigationControllerหลายตัวUIViewControllersและต้องตั้งค่าตัวระบุให้กับพวกเขาทั้งหมดแม้ว่าฉันจะไม่เคยเรียกหนึ่งในนั้นด้วยตัวระบุก็ตาม น่ารำคาญจริงๆมองหาจุดบกพร่องที่ไม่มีใครอยู่!
Alex Cio

ใช้ได้ผลสำหรับฉัน ไม่มีใครรู้ว่าทำไมถึงเกิดขึ้น? ดูเหมือนจะไม่สามารถค้นพบได้มาก - ข้อผิดพลาดที่ได้รับในการหวนกลับทำให้เบาะแสเพียงเล็กน้อย ฉันได้รับมันหลังจากแปลงสตอรี่บอร์ดเป็นเวอร์ชันล่าสุดและยิ่งใหญ่ที่สุด - ถ้าตอนนี้จำเป็นต้องใช้ Storyboard ID มันก็ไม่เคยเกิดขึ้นมาก่อนและการแปลงอัตโนมัติก็ไม่ได้ดูแลมัน
Josh Sutterfield

30

ฉันมีข้อผิดพลาดที่แน่นอนนี้กับ Storyboard ฉากเดียวธรรมดา ๆ และสิ่งที่ฉันต้องทำเพื่อแก้ไขก็คือเลือกช่องทำเครื่องหมาย "Is Initial View Controller" สำหรับคอนโทรลเลอร์ 1 มุมมองใน Storyboard ฉันสงสัยว่า Xcode ใช้เพื่อทำเครื่องหมายในช่องนี้ให้คุณโดยค่าเริ่มต้นในสถานการณ์นี้ แต่ไม่ทำอีกต่อไป

ทำเครื่องหมายที่ช่องด้านล่าง

                                     

ทำเครื่องหมายในช่องสำหรับตัวควบคุมมุมมองตัวใดตัวหนึ่งในกระดานเรื่องราวของคุณและคุณก็น่าจะดี


20

ฉันกลัวว่าคุณจะต้องผ่านทั้ง 30 ข้อและตรวจสอบว่าพวกเขามี Storyboard ID หรือต่อไปยังตัวควบคุมมุมมองนั้นหรือไม่ จำเป็นต้องมีหนึ่งในสองรายการทั้งสองอย่างเป็นตัวเลือก


5
หลังจากตัวควบคุมมุมมองทั้งหมดมี segue หรือ ID แล้วข้อความแสดงข้อผิดพลาดอาจยังคงอยู่ที่นั่น ในกรณีนี้ให้ทำความสะอาดผลิตภัณฑ์ก็จะหมดไป
Reinhard Männer

5
ในกรณีของฉันผลิตภัณฑ์สะอาดไม่เพียงพอที่จะกำจัดข้อความแสดงข้อผิดพลาดหลังจากที่ฉันแก้ไขข้อผิดพลาดแล้ว มันหายไปเมื่อฉันรีสตาร์ท Xcode (ฉันไม่ได้ลองปิด / เปิดโปรเจ็กต์อีกครั้งนั่นอาจได้ผลเช่นกัน)
JulianSymes

เหมือนกันสำหรับฉัน - ในที่สุดคุณต้องหยุดและรีสตาร์ท xcode เพื่อกำจัดข้อความแสดงข้อผิดพลาด
MusiGenesis

8

ปัญหานี้อาจเกิดขึ้นได้ในสถานการณ์ต่อไปนี้:

กรณี I: ถ้าไม่มีฉากในกระดานถูกทำเครื่องหมายเป็น"isInitialViewController"

แก้ไข: ระบุตัวควบคุมมุมมองรูทและทำเครื่องหมายเป็น"isInitialViewController"ใน SB ของคุณ ในกรณีนี้รหัสสตอรี่บอร์ดไม่บังคับ

กรณีที่ II

อาจมีสถานการณ์ที่คุณไม่จำเป็นต้องมี initialViewController ในสตอรี่บอร์ด เช่นเมื่อใช้สตอรี่บอร์ดหลายรายการ

การแก้ไข: ในกรณีเช่นนี้ตรวจสอบให้แน่ใจว่าได้ระบุ"storyboard id"ไว้อย่างถูกต้องและคุณอ้างถึงฉากแรกที่จะใช้ในกระดานเรื่องราวโดยใช้รหัสนี้ เช่น:

UIStoryboard *myStoryBoard = [UIStoryboard storyboardWithName:@"MyStoryBoardName" bundle:nil];
MyViewController *myViewController = (MyViewController *)[myStoryBoard instantiateViewControllerWithIdentifier:@"MyViewControllerId"];

ในกรณีนี้จำเป็นต้องมี"storyboard id"

กรณีที่สาม

คุณได้เชื่อมต่อ initialViewController แล้ว แต่คุณยังคงได้รับคำเตือนนี้ เพราะนี่คือบางส่วนของฉากในกระดานเรื่องราวอาจไม่สามารถเชื่อมต่อกับ"ทำต่อ"และพวกเขาไม่ได้มี"สตอรี่บอร์ด id" สแกนสตอรีบอร์ดของคุณดูว่าจำเป็นต้องมี"การต่อ"หรือไม่ เชื่อมต่อการต่อหากขาดหายไป หากไม่จำเป็นต้องทำต่อให้แน่ใจว่าคุณต้องให้"storyboard id"เนื่องจากเป็นวิธีเดียวที่จะอ้างอิงฉากจากโค้ดของคุณดังที่แสดงในโค้ดตัวอย่างด้านบน

หวังว่านี่จะช่วยได้


CASE III - ช่วยฉันด้วย ขอบคุณ!
mrGott

ฉันมีกรณีที่โครงการตัวอย่างมาพร้อมกับไฟล์ xib เก่า ฉันสร้าง storyBoard และตอนนี้ฉันกำลังทุกข์อยู่ .. ต้องแปลง xib เป็นรูปแบบ storyBoard แล้วย้ายจากตรงนั้น .. มองไม่เห็นวิธีสร้างฉากแอพพลิเคชั่นหรือเมนูเลย ..
nyxee

6

คุณไม่จำเป็นต้องตั้งค่าStoryboard IDสำหรับทุกฉากหรือUINavigationController

ดีฉันมีประมาณ 50-60 ฉากและฉันเพียงแค่คำเตือนเหล่านี้เพื่อให้ฉันรู้ว่ามีเพียงการควบคุม (บรรยากาศ) หรือ NavigationController Storyboard IDซึ่งไม่ได้เชื่อมต่อที่มีความต้องการทำต่อไปยังชุด

ป้อนคำอธิบายภาพที่นี่

คุณจะเห็นได้ว่าในภาพด้านบนUINavigationControllerไม่ได้เชื่อมต่อกับการต่อเนื่องมันเป็นตัวการของคำเตือนนั้น

เพียงแค่ให้ Storyboard ID เพื่อลบคำเตือนนี้


5

ฉันมีปัญหาเดียวกัน ฉันมีมุมมองมากมายในสตอรีบอร์ดของฉันด้วยตัวควบคุมแถบนำทางและแถบ สำหรับฉันมันเป็นเพียงคำเตือนเพื่อแจ้งให้คุณทราบว่ามุมมองบางส่วนไม่ได้เชื่อมต่อกัน ตรวจสอบให้แน่ใจว่ามุมมองทั้งหมดของคุณเชื่อมต่อกับตัวควบคุมมุมมองรูทไม่ทางใดก็ทางหนึ่ง ฉันเริ่มโปรเจ็กต์นี้ตั้งแต่เริ่มต้นเพื่อกำจัดคำเตือนนี้และสังเกตเห็นคำเตือนเดียวกันเมื่อไม่ได้เชื่อมต่อมุมมอง


สิ่งนี้ช่วยให้ฉัน ฉันใช้เกิน 7.1.1 Swift 2 เริ่มต้น StoryBoard HAS เพื่อเป็นตัวควบคุมมุมมองรูท
Lukesivi

3

วิธีที่ง่ายที่สุดในการค้นหาฉากที่ไม่เหมาะสม:

ไปที่ตัวนำทางปัญหา (ในแผงด้านซ้ายถัดจากปุ่มค้นหา) และดับเบิลคลิกที่ข้อผิดพลาด หน้าต่างจะปรากฏขึ้นซึ่งมีฉากที่กระทำผิดอยู่ตรงกลางหน้าต่าง

(โดยทั่วไปแล้วเป็นจริง - การดับเบิลคลิกที่ข้อผิดพลาดใด ๆ โดยทั่วไปจะทำให้ป๊อปอัปมีข้อผิดพลาดอยู่ตรงกลาง - เป็นเคล็ดลับเล็ก ๆ น้อย ๆ ที่เรียบร้อย!)

หมายเหตุด้านข้าง: บางครั้ง XCode จะให้ข้อผิดพลาดนี้อย่างไม่ถูกต้องสำหรับฉากที่เป็นตัวควบคุมมุมมองรูทของตัวควบคุมการนำทาง (นั่นคือตัวควบคุมมุมมองเริ่มต้น) การแก้ไขอย่างง่ายคือการให้ ID Storyboard ของตัวควบคุมมุมมองรูทนี้การคอมไพล์ (ข้อผิดพลาดควรหายไป) จากนั้นลบ storyboardID (ไม่มีข้อผิดพลาดอีกต่อไป)


ขอขอบคุณคำใบ้ของคุณ "การแก้ไขอย่างง่ายทำให้ตัวควบคุมมุมมองรูทนี้มี ID Storyboard" มันช่วยแก้ปัญหาของฉันได้ ฉันต้องให้ 'Storyboard ID' กับ UINavigationController
Mohd Haider

สิ่งนี้ชี้ให้ฉันไปที่ฉากแอปพลิเคชันด้วยเมนูหลัก ไม่สามารถให้ ID Storyboard นั้นได้
Daniel

2

วิธีที่ง่ายที่สุดในการดูว่าคอนโทรลเลอร์หรือฉากใดเป็นสาเหตุของปัญหานี้คือ:

  • Ctrl คลิกของคุณ.storyboardในโครงการ Navigator Open As > Source Codeและเลือก สิ่งนี้จะแสดง XML ที่เป็นพื้นฐานของ Storyboard
  • ในมุมมองนี้คำเตือนจะเกี่ยวข้องอย่างชัดเจนกับบรรทัดใน XML ที่เกี่ยวข้องกับฉากที่กระทำผิด

ตอนนี้ในกรณีของฉันคำเตือนนั้นน่ารำคาญเป็นพิเศษเพราะ "ฉากที่ไม่เหมาะสม" มีตัวระบุและมีส่วนต่อ! ฉันสามารถแก้ไขปัญหาได้โดยการลบฉากแล้วยกเลิกการลบ ไม่หรูหรา แต่ใช้งานได้ ฉันบันทึกสตอรี่บอร์ดของฉันก่อนทำสิ่งนี้ ในการมองย้อนกลับไปฉันควรจะทำสำเนาและdiffก่อน - หลัง


2
น่าแปลกที่สิ่งนี้ดูเหมือนจะไม่ได้ผลอย่างสม่ำเสมอ ในสถานการณ์บั๊กของฉันมันได้ผล ตอนนี้ฉันกำลังทดสอบและSource Codeมุมมองไม่แสดงข้อผิดพลาด ดังนั้นระยะทางอาจแตกต่างกันไป
Dmitry Minkovsky

ฉันไม่พบ View Controller ด้วยสิ่งนี้ แต่ฉันลบไปแล้ว (ใน XML ใช้งานไม่ได้ใน ID) และคำเตือนก็หายไป
Daniel

2

สำหรับฉันมันไม่ได้เป็นเพราะ a Storyboard IDหรือSegue. ฉันได้รับคำเตือนนี้เนื่องจากฉันไม่ได้ตั้งค่าไฟล์View Controller's Custom Class.

เลือกView ControllerบนStoryboardจากนั้นในUtilities PaneเลือกIdentity Inspectorไอคอน ภายใต้Custom Classดูว่าค่าใดอยู่ในClassฟิลด์

หากมีเพียงระบุว่าUIViewControllerคุณต้องพิมพ์ชื่อคลาส นี่จะเป็นชื่อของคุณ.hและ.mไฟล์ที่ประกอบเป็นUIViewControllerคลาสย่อยที่คุณกำหนดเอง


ฉันเพิ่งมีการเปลี่ยนแปลงเกี่ยวกับเรื่องนี้ ฉันจับคู่ ViewController ที่ไม่ถูกต้องในสตอรีบอร์ดของฉันกับคลาส ViewController และเช่นเดียวกันกับ Storyboard ID
Vince O'Sullivan

2

ฉันมาถึงคำถามนี้ในวันนี้ ฉันใช้ Xcode 6.3 และตอนนี้คำตอบสำหรับคำถามของ OP นั้นค่อนข้างง่าย:

เลือก View Controller ที่คุณต้องการเป็นคนแรกแสดง Attributes Inspector และในส่วน View Controller ตรวจสอบให้แน่ใจว่า

เป็น Initial View Controller

ถูกตรวจสอบ โวล่า!


2

ด้วย Xcode 7 สิ่งนี้สามารถจัดการได้อย่างง่ายดาย ไม่จำเป็นต้องผ่านฉากทั้งหมดด้วยตนเองเพื่อค้นหาฉากที่มีปัญหา ขั้นแรกไปที่ตัวนำทางรายงานซึ่งคุณสามารถรับข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับปัญหาที่ทราบได้ คำอธิบายปัญหามีลักษณะดังนี้:

Base.lproj / Main.storyboard: fPh-fe-F5F : คำเตือน: ฉากไม่สามารถเข้าถึงได้เนื่องจากไม่มีจุดเข้าและไม่มีตัวระบุสำหรับการเข้าถึงรันไทม์ผ่าน -instantiateViewControllerWithIdentifier:.

ด้วยข้อมูลนี้คุณสามารถคัดลอก id อ็อบเจ็กต์ได้ในกรณีนี้คือfPh-fe-F5Fและค้นหาพื้นที่ทำงานสำหรับการเกิดขึ้นของสตริงนี้ จะพบสตริงในไฟล์ Main.storyboard ดับเบิลคลิกที่ผลการค้นหาและจะเปิด Main.storyboard พร้อมฉากที่เลือก เมื่อคุณทราบฉากที่มีปัญหาแล้วคุณสามารถแก้ไขปัญหาได้อย่างง่ายดายโดยตั้งค่ารหัสสตอรี่บอร์ดหรือตั้งค่า "Is Initial View Controller"


1

คุณสามารถตั้งค่าตัวระบุ ในตัวตรวจสอบแอตทริบิวต์ในบานหน้าต่างด้านขวาคุณจะพบช่องที่เรียกว่า "Identifier" เพียงใส่สตริงใด ๆ ลงไปก็น่าจะใช้ได้

คุณสามารถคลิกที่ตัวควบคุมการนำทางและภายใต้ตัวตรวจสอบแอตทริบิวต์ให้คลิกปุ่ม "เป็นตัวควบคุมมุมมองเริ่มต้น" และสิ่งนี้ก็ใช้ได้เช่นกัน


1
โมฮัมหมัดขอบคุณที่ตอบกลับ แต่ปัญหาคือ: ฉากไหนที่ฉันควรตั้งค่าตัวระบุ? ฉันไม่พบฉากที่ทำให้เกิดคำเตือนนั่นคือปัญหาหลัก
Wolfy

1

ฉันประสบปัญหาเดียวกันและแก้ไขด้วยการใส่ storyboard ID ตัวระบุใด ๆ สำหรับ viewController และ NavigationController ทั้งหมดด้วย ข้อผิดพลาดจะถูกลบออกทันที

สนุก!!!


0

บางที XQuery นี้อาจช่วยคุณค้นหาฉากที่น่ารังเกียจเหล่านั้นได้

for $i in .//scene/objects/*[1][not(@storyboardIdentifier) or @storyboardIdentifier= '']/@id      (: find every scene that has an empty storyboardIdentifier :)
where count(.//segue[@destination= $i])= 0 and $i!= ./document/@initialViewController             (: filter the results to the scenes that are not destinations of a segue and exclude the initialViewController :) 
return ($i, $i/../@customClass)                                                                   (: return the storyboard-id and the customClass, if any :)

หากคุณติดตั้ง xqilla ไว้คุณจะบันทึกแบบสอบถามลงในไฟล์และใช้มันเช่น

xqilla <xqueryfile> -i <path to your storyboard>

0

ฉันไม่รู้ว่าสิ่งนี้ยังไม่ได้กล่าวถึงหรือไม่ แต่อีกเหตุผลหนึ่งที่คุณอาจได้รับคำเตือนนี้ก็คือหากคุณมีการติดตามไปในทิศทางที่ผิด ตัวอย่างเช่นในโครงการของฉันฉันได้รับคำเตือนนี้ แต่ในความเป็นจริงคอนโทรลเลอร์ทั้งหมดของฉันเชื่อมต่ออยู่ อย่างไรก็ตามหนึ่งในนั้นมีเรื่องที่ต้องพยายามนำเสนอผู้ปกครองจากเด็กแทนที่จะเป็นผู้ปกครองที่นำเสนอเด็ก สิ่งนี้ทำให้เกิดคำเตือนเดียวกัน


0

ฉันได้รับคำเตือนนี้เมื่อฉันมี UIViewController ใน Storyboard ซึ่งไม่มีการตั้งค่าใด ๆ ฉันหลีกเลี่ยงคำเตือนนี้โดยตั้งค่า Storyboard ID เป็น


0

ฉันมีปัญหาเดียวกัน แต่ฉันรู้ว่าฉันกำลังใช้มุมมองคอนเทนเนอร์และแทนที่จะลบตัวควบคุมมุมมองเริ่มต้นฉันลบตัวควบคุมดังนั้นตัวควบคุมมุมมองยังคงอยู่ในกระดานเรื่องราวและคำเตือนก็เช่นกัน นี่เป็นหนึ่งในกรณีที่คำเตือนปรากฏขึ้นหากตัวควบคุมมุมมองเริ่มต้นของมุมมองคอนเทนเนอร์ไม่ได้ถูกลบอย่างถูกต้องเมื่อคุณไม่ต้องการ


0

ฉันลองทุกอย่างที่อธิบายข้างต้นแล้ว แต่ก็ไม่มีประโยชน์ ฉันมีทุกอย่างที่เชื่อมต่ออย่างถูกต้องใน IB โดยมีหนึ่งตัวที่UIViewControllerกำหนดตัวควบคุมมุมมองรูท ฉันไม่มีตัวระบุ แต่เพิ่มเข้าไปในตัวควบคุมทั้งหมดของฉัน

วิธีเดียวที่ฉันจะได้รับคำเตือนให้หายไปคือการทำทุกอย่างข้างต้น (รวมถึงการรีบูตคอมพิวเตอร์และการสร้างใหม่ทั้งหมด) จากนั้นเปลี่ยนไปใช้สาขาที่ไม่มีข้อผิดพลาดของโครงการของฉันในคอมไพล์และกลับมาอีกครั้ง

ไม่แน่ใจว่าการกระทำใดที่แก้ไขได้หรือการกระทำที่รวมกัน แต่ไม่ใช่การสร้างที่สะอาดด้วยตัวมันเอง นี่อาจเป็นผลพลอยได้จาก Main.storyboard ที่เปลี่ยนแปลงอยู่เสมอเมื่อเพิ่งเปิดซึ่งหมายความว่าฉันต้องgit commit -m "Stupid storyboard"บ่อยกว่าที่ฉันต้องการ


0

นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน:

  1. เปิดกระดานเรื่องราวในโปรแกรมแก้ไขข้อความ
  2. เปลี่ยนเวอร์ชันจาก 3.0 เป็น 2.0 บันทึกและปิด
  3. เปิดอีกครั้งใน Visual Studio มันจะแปลงและเปิดเอกสารโดยอัตโนมัติ

0

ฉันได้รับข้อผิดพลาดเดียวกัน: สำหรับฉันข้อผิดพลาดคือฉันไม่ได้เริ่มตัวควบคุมมุมมองในกระดานเรื่องราวของฉัน

การแก้ไขที่ลบคำเตือนนั้น


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.