คุณเพิ่มการดำเนินการลงในปุ่มโดยใช้โปรแกรมใน xcode ได้อย่างไร


105

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

คำตอบ:


222

ลองสิ่งนี้:

สวิฟต์ 4

myButton.addTarget(self,
                   action: #selector(myAction),
                   for: .touchUpInside)

วัตถุประสงค์ -C

[myButton addTarget:self 
             action:@selector(myAction) 
   forControlEvents:UIControlEventTouchUpInside];

คุณสามารถค้นหาแหล่งข้อมูลมากมายได้ในเอกสารประกอบของ Apple มีลักษณะที่เป็นเอกสาร UIButton ของมันจะเผยให้เห็นว่า UIButton เป็นลูกหลานของUIControl,ซึ่งดำเนินการวิธีการที่จะเพิ่มเป้าหมาย

-

คุณจะต้องสนใจว่าจะเพิ่มลำไส้ใหญ่หรือไม่myActionใน ภายหลังaction:@selector(myAction)

นี่คือการอ้างอิง


จะเกิดอะไรขึ้นถ้าฉันต้องการส่งผ่านพารามิเตอร์ไปยังตัวเลือกเมื่อกดปุ่ม (เช่นฉันมีปุ่มภายใน UITableViewCell และฉันต้องการส่งผ่านวัตถุในเซลล์นั้นเมื่อกดปุ่มของเซลล์)
acecapades

1
@acecapades ฉันคิดว่าคุณกำลังผสมสองสิ่ง คุณไม่สามารถแนบพารามิเตอร์อย่างที่คุณทำได้กับ performSelector รูปแบบการดำเนินการที่ใช้โดย UIButton ที่สืบทอดมาจาก UIControl คือการแจ้งเตือนบางเป้าหมายด้วยตัวเลือกบางอย่างเมื่อ controlEvent ถูกทริกเกอร์ เมื่อสิ่งนี้เกิดขึ้นในกรณีของคุณคุณสามารถไปที่ซูเปอร์วิวเพื่อดูว่าใครเป็นผู้ห่อหุ้มปุ่มของคุณและถามวิธีการแก้ไขความสัมพันธ์ของ tablecell เป็นโมเดลจากนั้นทำสิ่งที่คุณต้องการด้วยสิ่งนั้น
Nick Weaver

1
ฉันเห็น. ที่สมเหตุสมผล ฉันคิดว่าฉันเข้าใจสิ่งที่คุณพูด ขอบคุณสำหรับเคล็ดลับ Nick!
acecapades

ใครสามารถแปลสิ่งนี้อย่างรวดเร็ว?

23

คำตอบที่รวดเร็ว:

myButton.addTarget(self, action: "click:", for: .touchUpInside)

func click(sender: UIButton) {
    print("click")
}

เอกสารประกอบ: https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget


":" สำหรับหลัง "คลิก" ในการเรียก UIControl.addTarget คืออะไร
dumbledad

1
Selectors มี:เป็นตัวยึดตำแหน่งสำหรับอาร์กิวเมนต์ของฟังก์ชัน เนื่องจากclickใช้senderอาร์กิวเมนต์ซึ่งจะถูกแทนที่ด้วย:ในสตริงตัวเลือก
Etan

สิ่งนี้ใช้ได้ผลกับฉันเมื่อเร็ว ๆ นี้สำหรับ Swift 3. button.addTarget (self, action: #selector (ViewController.click), for: UIControlEvents.touchUpInside) func click () {print ("click")} ขอบคุณ @Glauco Neves ที่ชี้ให้เราเห็น ตามเส้นทางที่ถูกต้อง
uplearnedu.com

14
CGRect buttonFrame = CGRectMake( 10, 80, 100, 30 );
        UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];
        [button setTitle: @"My Button" forState: UIControlStateNormal];
        [button addTarget:self action:@selector(btnSelected:) forControlEvents:UIControlEventTouchUpInside];
        [button setTitleColor: [UIColor redColor] forState: UIControlStateNormal];
[view addSubview:button];

เป็นไปได้หรือไม่ที่จะเพิ่มการกระทำ 2 รายการขึ้นไป
ErasmoOliveira

9

ลองสิ่งนี้:

ก่อนอื่นให้เขียนสิ่งนี้ในไฟล์. h ของ viewcontroller

UIButton *btn;

ตอนนี้เขียนสิ่งนี้ในไฟล์. m ของ viewcontrollers viewDidLoad

btn=[[UIButton alloc]initWithFrame:CGRectMake(50, 20, 30, 30)];
[btn setBackgroundColor:[UIColor orangeColor]];
//adding action programatically
[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];

เขียนเมธอด viewDidLoad ภายนอกนี้ในไฟล์. m ของตัวควบคุมมุมมองของคุณ

- (IBAction)btnClicked:(id)sender
{
   //Write a code you want to execute on buttons click event
}

8
 CGRect buttonFrame = CGRectMake( x-pos, y-pos, width, height );   //
 CGRectMake(10,5,10,10) 

 UIButton *button = [[UIButton alloc] initWithFrame: buttonFrame];

 button setTitle: @"My Button" forState: UIControlStateNormal];

 [button addTarget:self action:@selector(btnClicked:) 
 forControlEvents:UIControlEventTouchUpInside];

 [button setTitleColor: [UIColor BlueVolor] forState:
 UIControlStateNormal];

 [view addSubview:button];




 -(void)btnClicked {
    // your code }

6

สำหรับ Swift 3

สร้างฟังก์ชันสำหรับการทำงานของปุ่มก่อนแล้วจึงเพิ่มฟังก์ชันให้กับเป้าหมายปุ่มของคุณ

func buttonAction(sender: UIButton!) {
    print("Button tapped")
}

button.addTarget(self, action: #selector(buttonAction),for: .touchUpInside)

3
UIButton *btnNotification=[UIButton buttonWithType:UIButtonTypeCustom];
btnNotification.frame=CGRectMake(130,80,120,40);
btnNotification.backgroundColor=[UIColor greenColor];
[btnNotification setTitle:@"create Notification" forState:UIControlStateNormal];
[btnNotification addTarget:self action:@selector(btnClicked) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btnNotification];


}

-(void)btnClicked
{
    // Here You can write functionality 

}

โปรดแสดงความคิดเห็นเพื่ออธิบายว่าตัวอย่างของคุณสามารถช่วยได้อย่างไร
Nogard

UIButton * btnNotification = [UIButton buttonWithType: UIButtonTypeCustom]; btnNotification.frame = CGRectMake (130,80,120,40); // การตั้งค่าเฟรมปุ่ม btnNotification.backgroundColor = [UIColor greenColor]; [btnNotification setTitle: @ "create Notification" forState: UIControlStateNormal]; // ตั้งชื่อสำหรับปุ่ม [btnNotification addTarget: self action: @selector (btnClicked) forControlEvents: UIControlEventTouchUpInside]; // เพิ่ม Target For button [self.view addSubview: btnNotification];} - (โมฆะ) btnClicked {// ที่นี่คุณสามารถเขียนฟังก์ชัน}
user2677311

- (โมฆะ) btnClicked {// ที่นี่สิ่งที่คุณต้องการคุณสามารถตั้งค่าการดำเนินการสำหรับปุ่ม // ตัวอย่าง: ไปที่ viewcontroller ถัดไป nextviewController * nextPage = [nextviewController จัดสรร] init]; [self.navigationController pushviewcontroller: nextPage animated: YES]; }
user2677311

2

UIButtonสืบทอดมาจากUIControl. ที่มีทั้งหมดของวิธีการที่จะเพิ่ม / ลบการกระทำ: UIControl ชั้นอ้างอิง ดูหัวข้อ "การเตรียมและการส่งข้อความการกระทำ" ซึ่งครอบคลุมและ– sendAction:to:forEvent:– addTarget:action:forControlEvents:


1
 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button addTarget:self 
       action:@selector(aMethod1:)
forControlEvents:UIControlEventTouchUpInside];
[button setTitle:@"Show View" forState:UIControlStateNormal];
button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0);
[view addSubview:button];   
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.