Lập trình bấm nút bấm sự kiện?


126

Có cách nào để lập trình kích hoạt một sự kiện nhấn nút không? Tôi có một nút được đặt ở đó trong một UIView và trong một kịch bản cụ thể tôi muốn nhấp vào nút thông qua mã, chứ không phải thủ công như một người dùng. Có thể phát triển iOS không? Vui lòng cung cấp đề xuất của bạn và hướng dẫn tôi làm thế nào để làm điều đó.

Cảm ơn.

Câu trả lời:


313

Giống như câu trả lời của Ken, nhưng linh hoạt hơn vì nó sẽ theo dõi các nút hành động thực tế nếu bạn thay đổi chúng hoặc thêm nhiều hơn một.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];

8
Điều này có làm nổi bật nút nếu button.showsTouchWhenHighlighted = YESmuốn với một cú chạm thực tế không?
chown

2
Câu trả lời này rất hay, nó có thể dễ dàng được dịch sang các điều khiển khác như UISwitch (UIControlEventValueChanged) và trong trường hợp của tôi tốt hơn nhiều so với việc gọi trực tiếp mã đích / hành động b / c Tôi muốn chuyển đổi! Cám ơn.
John Erck

Không, nó không làm nổi bật nút nếu nút.showsTouchWhenHighlighted = CÓ. ; (
Richie Hyatt

7
Nếu bạn cần sự nổi bật, bạn có thể làm điều này. [nút setHighlighted: CÓ]; [nút sendActionsForControlEvents: UIControlEventTouchUpInside]; [nút setHighlighted: NO]; và nó hoạt động rất tốt. -rrh
Richie Hyatt

Xin chào @zaky, nếu tôi chỉ muốn hoạt hình, không gửi hành động, tôi phải làm thế nào?
benhi

13

Tôi đã có vấn đề tương tự như trên. Tôi đã có thể đăng một bình luận, nhưng danh tiếng của tôi không đủ cao. Vì vậy, thay vào đó tôi sẽ đăng câu trả lời đầy đủ:

[btn setHighlighted:YES];
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
[btn performSelector:@selector(setHighlighted:) withObject:NO afterDelay:0.25];

Điều này sẽ lập trình nhấn nút và làm nổi bật nó trong một khoảng thời gian dường như bình thường. Đề xuất của Richie không hoạt động vì nút chỉ được tô sáng (nếu có) trong một khoảng thời gian không thể chấp nhận được.


Nó không được tô sáng, bản vẽ chỉ xảy ra sau khi đoạn mã hiện tại kết thúc. Đây là một sửa chữa tốt đẹp.
mattsven

6

Tại sao không chỉ thực thi mã thực thi khi người dùng nhấn nút?

-(void)myMethod
{
   // do stuff
}

-(IBAction)myButtonClick:(id)sender
{
    [self myMethod];
}

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}

Không, yêu cầu của tôi là không gọi phương thức, cách bắn nút bấm sự kiện theo chương trình, không phải khi người dùng nhấp vào phương thức. Tôi đã tạo một UIButton theo chương trình trong một UIView, tôi muốn tự động kích hoạt sự kiện nhấn nút sau một khoảng thời gian nhất định thông qua chính chương trình, không phải bởi người dùng.
Getsy

Sau đó, không thể mà không tổng hợp cảm ứng. Xem cocoawithlove.com/2008/10/ . Tuy nhiên, bạn không thể gửi ứng dụng của mình đến App Store bằng phương pháp này, vì nó sử dụng API riêng. Nó thường được sử dụng cho mục đích gỡ lỗi.
Evan Mulawski

Bạn không giải thích lý do tại sao bạn cần mô phỏng một cú chạm so với chỉ gọi phương thức nhưng đó là cách dễ nhất để đi. Hành động hẹn giờ của bạn có thể gọi bất kỳ phương thức nào bạn muốn và phương thức mà nó gọi có thể đưa ra phản hồi trong UI rằng nút đang được nhấn bằng cách thay đổi trạng thái nút (được chọn, tô sáng, v.v.). Nếu điều đó không làm việc, vì vậy hãy là nó.
XJones

1

Nếu bạn đang nói về một UIButton, bạn chỉ có thể gọi cùng một phương thức mà UIButton đang gọi khi nó được gõ. Ví dụ:

[self myButtonsTargetMethod];

Không, yêu cầu của tôi là không gọi phương thức, cách bắn nút bấm sự kiện theo chương trình, không phải khi người dùng nhấp vào phương thức. Tôi đã tạo một UIButton theo chương trình trong một UIView, tôi muốn tự động kích hoạt sự kiện nhấn nút sau một khoảng thời gian nhất định thông qua chính chương trình, không phải bởi người dùng.
Getsy

1

Đúng,

[_button setHighlighted:YES];
[_button sendActionsForControlEvents:UIControlEventTouchUpInside];
[_button setHighlighted:NO];

Nhưng vấn đề ở đây là bạn sẽ không thể xem những sự kiện đó vì nó quá nhanh. Vì vậy, những gì bạn có thể làm là thử mã trên với NSTimer.

NSTimer *quick = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(MeFirst:) userInfo:nil repeats:NO];

MeFirst là phương pháp tôi đã tạo ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.