2011-08-29 29 views
14

Tôi có một yêu cầu điển hình trong đó tôi cần phải giữ nút ở trạng thái được tô sáng sau khi nhấn nó. Tôi cần thực hiện tác vụ chỉ hoạt động khi một nút ở trạng thái được đánh dấu. Thực ra tôi đang thiết lập trạng thái nút để được đánh dấu theo chương trình.Cách đặt trạng thái UIButton được tô sáng sau khi nhấn nó

[sender setHighlighted:YES];

Và một khi nút ở trạng thái được đánh dấu tôi cần phải thực hiện thao tác khác.

- (IBAction)changeState: (UIButton*)sender 
{ 
    if (sender.highlighted == YES) 
    { 
     [self performSomeAtion:sender]; 
    } 
} 

Nhưng, kinh dị, bất cứ khi nào tôi nhấn bất kỳ nút nào, điều kiện trên trở nên đúng và hành động được thực hiện liên tục. Có cách nào mà tôi có thể giữ trạng thái của UIButton được tô đậm sau khi nhấn nó không?

EDIT - Thực ra tôi cần thực hiện 3 hành động khác nhau cho 3 trạng thái khác nhau của nút. Tôi đã sử dụng trạng thái được chọn và trạng thái bình thường. Bây giờ, tôi cần sử dụng trạng thái được đánh dấu.

+0

Bạn có thể thiết lập một biến BOOL mà sẽ cập nhật để TRUE một khi hành động đã được thực hiện. –

+0

nhưng tôi cần đặt nút thành trạng thái được đánh dấu và nó phải ở trong trạng thái được tô sáng trừ khi tôi thay đổi lại .. –

+0

Chỉ với ios 7, bạn nên cân nhắc đặt renderMode thành UIImageRenderingModeAlwaysTemplate và sau đó sử dụng màu Tint để biểu diễn các trạng thái khác nhau . xem http://stackoverflow.com/questions/19802982/apply-tintcolor-to-uiimage –

Trả lời

4

Trạng thái được đánh dấu được sử dụng để làm nổi bật nút trong khi đang được chạm vào. Một sự kiện chạm vào trong nút làm nổi bật nó. Thay vào đó, bạn nên sử dụng trạng thái "đã chọn".

Nếu những gì bạn muốn làm là thực hiện một thao tác sau khi nhấn nút, không đính kèm phương pháp của bạn vào sự kiện thay đổi trạng thái, đính kèm phương thức của bạn vào sự kiện TouchUpInside.

+0

+1 để được giải thích tốt. Trên thực tế tôi cần phải thực hiện 3 hành động khác nhau cho 3 trạng thái khác nhau của nút. Đây là nơi tôi đã bị mắc kẹt .. Bất kỳ trợ giúp nào cũng sẽ được đánh giá cao (Vui lòng kiểm tra câu hỏi cập nhật của tôi) –

1

Sử dụng [sender setSelected: YES];, tôi nghĩ nó sẽ hữu ích cho bạn.

+0

như đã đề cập trong câu hỏi của tôi, tôi cần sử dụng trạng thái được đánh dấu của nút không phải trạng thái đã chọn. –

+0

UIButton * btn_tmp = người gửi, nếu (! (Btn_temp.selected)) {// nó đúng khi nút không được chọn } – Narayana

15
[sender setSelected:YES]; 

hoặc bạn có thể mô phỏng hiệu ứng này với hai hình ảnh cho UIButton của bạn (notselectedimage.pngselectedimage.png), sau đó giữ nút trạng thái theo dõi với một biến BOOL như BOOL buttonCurrentStatus;. Sau đó, trong tập tin .h:

BOOL buttonCurrentStatus; 

và trong file .m

// connect this method with Touchupinside function 
- (IBAction)changeState:(UIButton*)sender 
{ 
    /* if we have multiple buttons, then we can 
     differentiate them by tag value of button.*/ 
    // But note that you have to set the tag value before use this method. 

    if([sender tag] == yourButtontag){ 

    if (buttonCurrentStatus == NO) 
    { 
     buttonCurrentStatus = YES; 
     [butt setImage: [UIImage imageNamed:@"selectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    else 
    { 
     buttonCurrentStatus = NO; 
     [butt setImage:[UIImage imageNamed:@"notSelectedImage.png"] forState:UIControlStateNormal]; 
     //[self performSomeAction:sender]; 
    } 
    } 
} 
+0

Cảm ơn câu trả lời vijay .. Câu trả lời của bạn hoạt động tốt nếu tôi có một nút. Nhưng trường hợp của tôi phức tạp hơn một chút. Tôi có nhiều nút mà nên thực hiện 3 hành động cho 3 tiểu bang .. Bất cứ đề nghị ??? 1 cho câu trả lời ur quá ... –

+0

UISegmentControl u know.use that.if u muốn được giúp đỡ nhiều hơn sau đó trả lời.http: //www.mobisoftinfotech.com/blog/iphone/iphone-segmented-controluisegmentedcontrol-tutorial/ –

+2

Nếu bạn có nhiều nút, tất cả những gì bạn phải làm là lấy câu trả lời của Vijay và tinh chỉnh nó bằng cách thêm 'tag' vào các nút của bạn và sau đó thực hiện ... 'UIButton * button = (UIButton *) người gửi; ' ' if (nút. tag == 1) ... ' –

2

Cách bạn mô tả nó, bạn muốn được tốt hơn subclassing UIView để tạo nút ba trạng thái của riêng bạn.

Thực ra, bạn thậm chí nên thực hiện nút nhấn nhiều lần của riêng mình và quản lý trạng thái của nó trong nội bộ thông qua một mảng PNG cho giao diện và một loạt trạng thái để biết số lần được nhấn.

0
UIButton *btn_tmp=sender; 
    if(!(btn_tmp.selected)) 
    { 
[btn_temp setHighlighted:YES]; 

} 
+0

tôi đã đặt nút thành trạng thái được đánh dấu. Nhưng, khi tôi cố gắng kiểm tra trạng thái của nút, tôi không thể nhận được trạng thái chính xác. Tôi đoán khi tôi nhấn cùng một nút, trạng thái đang nhận được thay đổi từ được đánh dấu để cái gì khác .. là có cách nào để tìm thấy narayana ? –

3

Tôi chỉ cần tìm một cách, vì vậy tôi chia sẻ nó, chỉ trong trường hợp ...

tôi giữ UIButton của tôi và thiết lập một hình ảnh cho mỗi tiểu bang (do đó bạn có thể đi đến một nút 4 tiểu bang). Tôi đặt UserInteractionEnabled thành NO -> Nút này sẽ không nhận được bất kỳ liên lạc nào. Mục đích của nút đầu tiên này là để hiển thị trạng thái

Tôi tạo một UIButton tùy chỉnh thứ hai có cùng khung với khung hình đầu tiên. Đối với hình ảnh này, không có hình ảnh nào được đặt cho trạng thái (đó là một nút hoàn toàn trong suốt). Mục đích của nút này là để nắm bắt các sự kiện liên lạc. Vì vậy, tôi đã thêm mục tiêu vào nút này trên sự kiện TouchUpInside. Và sau đó khi sự kiện được kích hoạt, tôi thay đổi trạng thái của nút đầu tiên thành Disabled, Highlighted, Selected, hoặc không có trạng thái nào trong số này (= Trạng thái mặc định).

Mọi thứ đang hoạt động như một sự quyến rũ!

6
- (void)mybutton:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    button.selected = ![button isSelected]; // Important line 
    if (button.selected) 
    { 
     NSLog(@"Selected"); 
     NSLog(@"%i",button.tag); 
    } 
    else 
    { 
     NSLog(@"Un Selected"); 
     NSLog(@"%i",button.tag); 

    } 
} 
0

Giải pháp là khó khăn nhưng nó có thể.

Sự cố là bạn đã cố gắng thay đổi trạng thái được đánh dấu trong phương thức tác vụ nút, mà tôi cho là làm sạch hoặc kiểm tra quá trình ở cuối hành động và chuyển trạng thái được đánh dấu. Khi bạn cố gắng gỡ lỗi nó, bạn sẽ được đánh dấu = 1 nhưng nó sẽ thay đổi ở cuối.

Lạ nhưng nút "3 trạng thái" đôi khi hữu ích, khi bạn muốn giữ nút ở chế độ "được đánh dấu" như chế độ "đã chọn" để có hành động khác nhau tùy thuộc vào 3 trạng thái. Vấn đề duy nhất mà bạn không thể phân tích điều này hoặc chuyển sang chế độ được đánh dấu trong phương thức thao tác nút vì điều này sẽ chuyển sang chế độ được đánh dấu ngay lập tức khi người dùng đẩy nó VÀ chuyển nó trở lại ở cuối.

Giải pháp là sử dụng công văn.

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC); 
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [theButton setHighlighted:YES]; 
}); 

Điều này sẽ thực hiện thủ thuật và bạn có thể sử dụng 3 trạng thái.

0

Theo táo, UIButton có một tài sản của imageView:

Mặc dù khách sạn này là read-only, tính riêng của mình được đọc/ghi. Sử dụng các đặc tính này để cấu hình sự xuất hiện và hành vi của quan điểm của nút

này có nghĩa là bạn có thể đặt trong IB (trong storyboard) một hình ảnh cho nút này và đặt các hình ảnh nổi bật:

  1. Mở thanh tra Thuộc tính.
  2. Dưới Nút phần, chọn một hình ảnh.
  3. Trong cùng một phần, hãy thay đổi Cấu hình trạng thái thành Được đánh dấu. Lưu ý hình ảnh bạn chọn theo mặc định hiện đã biến mất và bây giờ bạn có thể đặt một ảnh mới cho Mục được tô sáng.
  4. Bây giờ bạn có một nút có cấu hình 2 trạng thái và tất cả những gì bạn phải làm trong thời gian chạy để thay đổi button.highlighted = true. Ngoài ra, hãy kiểm tra số UIControl trong số Định cấu hình thuộc tính của Kiểm soát để biết thêm trạng thái.

Bạn cũng có thể làm điều đó programatically như sau:

Swift (và gần như giống nhau trong Objective-C):

// Setting the highlighted image 
self.someButton.imageView?.highlightedImage = UIImage(named: "imageNameFromImageAssest") 
// someButton will now some the highlighted image and NOT the image set in the IB 
self.someButton.imageView?.highlighted = true 
Các vấn đề liên quan