IBOutlet และ IBAction


159

วัตถุประสงค์ของการใช้ IBOutlets และ IBActions ใน Xcode และ Interface Builder คืออะไร

มันสร้างความแตกต่างหรือไม่ถ้าฉันไม่ใช้ IBOutlets และ IBActions


สวิฟท์:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

Objective-C:

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
คำตอบทั้งหมดพูดถึงแนวคิดประเภทเดียวกัน .. แต่ไม่มีใครอธิบายว่าทำไมตัวสร้างส่วนต่อประสานดูเหมือนจะทำงานได้เหมือนกันถ้าคุณไม่รวม IBAction / IBOutlet ในแหล่งที่มาของคุณ มีเหตุผลอื่นอีกหรือไม่สำหรับ IBAction และ IBOutlet หรือไม่ก็ปล่อยทิ้งไว้ใช่ไหม
bobobobo

2
คำตอบของ Michael Rogers ด้านล่างเพิ่มคำอธิบายเล็กน้อยว่าทำไมรหัสจึงใช้ได้แม้ว่า IBAction จะถูกปล่อยออกไป
กฤษณะ

IBActions มีอยู่เป็นส่วนหนึ่งของกลไกการโต้ตอบการดำเนินการเป้าหมายคุณสามารถอ่านเกี่ยวกับวิธีการที่ IBAction เหมาะสมกับที่นี่: developer.apple.com/library/ios/documentation/General/ คุณสามารถอ่าน Outlets ได้ที่นี่: developer.apple com / library / ios / เอกสาร / ทั่วไป / …
William Power

คำตอบ:


208

IBActionและIBOutletเป็นมาโครที่กำหนดไว้เพื่อแสดงถึงตัวแปรและวิธีการที่สามารถอ้างถึงในเครื่องมือสร้างอินเทอร์เฟซ

IBActionแก้ไขvoidและIBOutletไม่ทำอะไรเลย แต่สิ่งเหล่านี้มีความหมายต่อ Xcode และตัวสร้างส่วนต่อประสานที่ตัวแปรและวิธีการเหล่านี้สามารถใช้ในตัวสร้างส่วนต่อประสานเพื่อเชื่อมโยงองค์ประกอบ UI กับรหัสของคุณ

หากคุณไม่ต้องการใช้เครื่องมือสร้างส่วนติดต่อเลยคุณไม่จำเป็นต้องใช้เครื่องมือเหล่านี้ในรหัสของคุณ แต่หากคุณต้องการใช้งานเครื่องมือนี้คุณจะต้องระบุIBActionวิธีการที่จะใช้ใน IB และIBOutletวัตถุ ที่จะใช้ใน IB


@Jasarien "คุณต้องระบุ IBAction สำหรับวิธีการที่จะใช้ใน IB และ IBOutlet สำหรับวัตถุที่จะใช้ใน IB" ความแตกต่างคืออะไร?
cyrilchampier

3
@nerith ความแตกต่างเดียวกันที่มีอยู่ระหว่างวิธีการและวัตถุ IBActions สำหรับวิธีการ IBOutlet สำหรับวัตถุ
Jasarien

เพียงชี้แจงตั้งแต่โพสต์ของฉันคือการแก้ไขไม่สามารถแก้ไขไปIBOutlet idพิจารณาสิ่งนี้: IBOutlet UILabel *nameLabel;- ถ้าIBOutletแก้ไขidแล้วรหัสนั้นจะอ่านid UIlabel *namelabel;ซึ่งก่อให้เกิดข้อผิดพลาดของคอมไพเลอร์ ที่ผมกล่าวมา แต่เดิมIBOutletแก้ไขเพื่ออะไร
Jasarien

38

วิธีดั้งเดิมในการตั้งค่าสถานะวิธีการเพื่อให้ปรากฏในตัวสร้างส่วนต่อประสานและคุณสามารถลากการเชื่อมต่อไปได้เพื่อทำให้วิธีการส่งคืนชนิด IBAction อย่างไรก็ตามหากคุณทำให้วิธีการของคุณเป็นโมฆะแทน (IBAction คือ # define'd ให้เป็นโมฆะ) และให้อาร์กิวเมนต์ (id) วิธียังคงปรากฏให้เห็น สิ่งนี้ให้ความยืดหยุ่นเป็นพิเศษ

ทั้งสามสิ่งนี้สามารถเห็นได้จากเครื่องมือสร้างส่วนต่อประสาน:

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender;

ดูคู่มือผู้ใช้ของตัวสร้างส่วนต่อประสานของ Apple สำหรับรายละเอียดโดยเฉพาะอย่างยิ่งในส่วนที่ชื่อว่า Xcode Integration


1
นี่คือลิงค์ไปยังคู่มือข้างต้นที่แนะนำ: developer.apple.com/library/ios/recipes/…
Aggressor

32

คุณต้องใช้ IBOutlet และ IBAction หากคุณใช้ตัวสร้างส่วนต่อประสาน (ดังนั้นส่วนนำหน้า IB) สำหรับส่วนประกอบ GUI ของคุณ IBOutlet จำเป็นต้องเชื่อมโยงคุณสมบัติในแอปพลิเคชันของคุณกับส่วนประกอบใน IB และ IBAction ใช้เพื่อให้วิธีการของคุณเชื่อมโยงกับการกระทำใน IB

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

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

จากนั้นใน IB คุณจะต้องเชื่อมต่อ myLabel กับป้ายกำกับและเชื่อมต่อวิธี pushme ด้วยปุ่ม คุณต้องการ IBAction และ IBOutlet เพื่อให้การเชื่อมต่อเหล่านี้มีอยู่ใน IB


13
แต่ทำไมมันยังใช้งานได้ถ้าคุณไม่รวมการติดฉลาก IBOutlet ..
bobobobo

7
เนื่องจากมาโครเหล่านี้ไม่ได้ทำอะไรเลยในเวลาคอมไพล์จึงเป็นเรื่องง่ายที่แอพ Interface build สามารถค้นหาวิธีการเหล่านั้นและไฟล์เครื่องมือสร้างส่วนต่อประสานในซอร์สโค้ดเพื่อให้คุณสามารถลากระหว่างตัวสร้างส่วนต่อประสานและรหัสของคุณ ไม่ว่าอีกต่อไป
วันนาธาน

IBAction ไม่ทำอะไรเลยในช่วงเวลาแก้ไขอย่างน้อยทศวรรษที่ผ่านมา คุณสามารถเชื่อมต่อ(void)วิธีการใน Interface Builder ได้เช่นกัน
J. Cocoe

7

เครื่องมือสร้างส่วนต่อประสานใช้เพื่อกำหนดว่าสมาชิกและข้อความใดที่สามารถ 'ใช้สาย' จนถึงส่วนควบคุมส่วนต่อประสานที่คุณใช้ในหน้าต่าง / มุมมองของคุณ

IBOutlet และ IBAction นั้นล้วนมีตัวบ่งชี้ที่ตัวสร้างส่วนติดต่อค้นหาเมื่อแยกวิเคราะห์รหัสของคุณในขณะออกแบบพวกเขาจะไม่มีผลกระทบใด ๆ ต่อโค้ดที่สร้างโดยคอมไพเลอร์


7

วิ่งเข้าไปในไดอะแกรมในขณะที่ดูการเข้ารหัสค่าคีย์คิดว่าอาจช่วยใครซักคน ช่วยด้วยความเข้าใจว่า IBOutlet คืออะไร

เมื่อดูที่โฟลว์เราจะเห็นว่า IBOutlets อยู่ตรงนั้นเพื่อจับคู่ชื่อคุณสมบัติกับชื่อตัวควบคุมในไฟล์ Nib

วิธีโหลดไฟล์ปากกาภาพหน้าจอของหนังสือออนไลน์ของ Matt สำหรับ iOS6


คำตอบนี้จะอธิบายว่าทำไมและวิธี IBOutlets ทำงานไม่เพียง แต่สิ่งที่พวกเขาทำ
Jeffery Opoku-Mensah

4

ทางออกคือการเชื่อมโยงจากรหัสไปยัง UI หากคุณต้องการแสดงหรือซ่อนองค์ประกอบ UI หากคุณต้องการได้รับข้อความของฟิลด์ข้อความหรือเปิดใช้งานหรือปิดการใช้งานองค์ประกอบ (หรือสิ่งอื่น ๆ ร้อย) คุณต้องกำหนดทางออกของวัตถุนั้นในแหล่งที่มาและการเชื่อมโยงที่ร้าน ผ่าน“ วัตถุอินเตอร์เฟส” ไปยังองค์ประกอบ UI หลังจากนั้นคุณสามารถใช้เต้าเสียบเช่นเดียวกับตัวแปรอื่น ๆ ในการเข้ารหัสของคุณ

IBAction - วิธีพิเศษที่ทริกเกอร์โดยวัตถุส่วนต่อประสานผู้ใช้ ตัวสร้างส่วนต่อประสานรู้จักพวกเขา

@interface Controller
{
  IBOutlet id textField; // links to TextField UI object
}

- (IBAction)doAction:(id)sender; // e.g. called when button pushed

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารของ Apple


เอ่อไม่ใช่นั่นไม่ใช่สิ่งที่ IBOutlet คุณได้ความคิดนั้นมาจากที่ใด
Richard J. Ross III

3

IBAction และ IBOutlets ใช้เพื่อเชื่อมต่อส่วนต่อประสานของคุณกับเครื่องมือสร้างส่วนต่อประสานกับผู้สร้าง หากคุณไม่ได้ใช้ตัวสร้างส่วนต่อประสานและสร้างส่วนต่อประสานของคุณเป็นรหัสคุณสามารถสร้างโปรแกรมโดยไม่ต้องใช้พวกเขา แต่ในความเป็นจริงพวกเราส่วนใหญ่ใช้ตัวสร้างส่วนต่อประสานเมื่อคุณต้องการให้การโต้ตอบเกิดขึ้นในส่วนต่อประสานของคุณคุณจะต้องใช้ IBActions และ IBoutlet


2

IBOutlet

  • มันเป็นสถานที่ให้บริการ
  • เมื่อโหลดไฟล์ nib (IB) มันจะกลายเป็นส่วนหนึ่งของข้อมูลที่ห่อหุ้มซึ่งเชื่อมต่อกับตัวแปรอินสแตนซ์
  • การเชื่อมต่อแต่ละครั้งจะถูกยกเลิกการเก็บถาวรและสร้างใหม่อีกครั้ง

IBAction

  • แอตทริบิวต์ระบุว่าวิธีนี้เป็นวิธีการที่คุณสามารถเชื่อมต่อกับจากกระดานเรื่องราวของคุณในเครื่องมือสร้างอินเตอร์เฟส

@ - รูปแบบไดนามิก IB - เครื่องมือสร้างส่วนต่อประสาน


2

หนึ่งในความเห็นสูงสุดของคำถามนี้ถามโดยเฉพาะ:

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


คำถามนี้ตอบได้ดีโดย NSHipster:

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

เร็วเท่าที่ 2004 (และอาจจะเร็วกว่านี้) IBAction ไม่จำเป็นสำหรับวิธีการที่สังเกตโดยตัวสร้างส่วนต่อประสานอีกต่อไป วิธีการใด ๆ ที่มีลายเซ็น-(void){name}:(id)senderจะปรากฏในบานหน้าต่างสาขา

อย่างไรก็ตามนักพัฒนาหลายคนพบว่ามีประโยชน์ที่จะยังคงใช้ประเภทการคืนค่าของ IBAction ในการประกาศเมธอดเพื่อแสดงว่าวิธีการเฉพาะนั้นเชื่อมต่อกับการกระทำ แม้แต่โครงการที่ไม่ได้ใช้สตอรีบอร์ด / XIB ก็อาจเลือกใช้ IBAction เพื่อเรียกวิธีการเป้าหมาย / การกระทำออกมา

IBOutlet:

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

ซึ่งแตกต่างจาก IBAction, IBOutlet ยังคงต้องการการเชื่อมต่อคุณสมบัติในรหัสกับวัตถุใน Storyboard หรือ XIB

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


1

เมื่อคุณใช้ตัวสร้างส่วนติดต่อคุณสามารถใช้ Connections Inspector เพื่อตั้งค่าเหตุการณ์ด้วยตัวจัดการเหตุการณ์ตัวจัดการเหตุการณ์ควรจะเป็นฟังก์ชันที่มีตัวปรับเปลี่ยน IBAction มุมมองสามารถเชื่อมโยงกับการอ้างอิงสำหรับชนิดเดียวกันและด้วยตัวดัดแปลง IBOutlet

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