có thể cập nhật tiêu đề / văn bản UIButton theo lập trình không?


96

Tôi có một UIButton, mà khi được nhấn, sẽ hiển thị một chế độ xem mới nơi người dùng có thể thay đổi một số cài đặt. Khi chế độ xem bị loại bỏ, tôi muốn cập nhật tiêu đề / văn bản của chế độ UIButtonxem để phản ánh trạng thái mới. Tôi đang gọi:

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];
[myButton setTitle: @"myTitle" forState: UIControlStateApplication];
[myButton setTitle: @"myTitle" forState: UIControlStateHighlighted];
[myButton setTitle: @"myTitle" forState: UIControlStateReserved];
[myButton setTitle: @"myTitle" forState: UIControlStateSelected];
[myButton setTitle: @"myTitle" forState: UIControlStateDisabled];

Nhưng nó dường như không bao giờ thay đổi so với văn bản / tiêu đề ban đầu như được chỉ định trong IB.


2
Bạn có chắc chắn mã đã đăng đang được gọi không? Bạn có đặt một BẬT MÍ để chứng minh điều đó không? Bạn có thể đăng chữ ký của người đại diện của bạn không?
Pablo Santa Cruz

3
Ngoài ra, tôi tin rằng bạn có thể tham chiếu nhiều trạng thái điều khiển cùng một lúc: [myButton setTitle: @ "myTitle" forState :( UIControlStateNormal | UIControlStateApplication | UIControlStateHighlighted | ...)]; Lưu ý việc sử dụng toán tử OR theo bit ngược lại với toán tử OR logic (||). Nói chung, khi bạn đang xử lý các trạng thái như thế này, bạn có thể HOẶC chúng cùng với dấu | nhà điều hành. Ai đó sửa cho tôi nếu tôi hoàn toàn nhầm lẫn. :)
CIFilter

Tôi muốn họ có một mặt hàng như UIControlStateAll: D
taber

2
Các kết hợp bitwise dường như không hoạt động đối với tôi trong iOS5.
Echilon

Vấn đề tương tự ở đây. Kết hợp bitwise không hoạt động đối với tôi trên iOS5. / CC @LucasTizma
znq 22/09/12

Câu trả lời:


52

Bạn có nút được chỉ định làm IBOutlet trong lớp bộ điều khiển chế độ xem của mình không và nó có được kết nối đúng cách như một ổ cắm trong Trình tạo giao diện (ctrl kéo từ ổ cắm tham chiếu mới đến chủ sở hữu tệp và chọn đối tượng UIButton của bạn) không? Đó thường là vấn đề tôi gặp phải khi gặp những triệu chứng này.


Chỉnh sửa: Mặc dù không phải như vậy ở đây, nhưng điều tương tự cũng có thể xảy ra nếu bạn đặt tiêu đề được gán cho nút, sau đó bạn cố gắng thay đổi tiêu đề chứ không phải tiêu đề được gán.


4
Bingo, đó là nó, cảm ơn. Tôi thực sự ước gì Objective-C sẽ ném một NullPointerException trong những trường hợp như thế này, thay vì âm thầm giả vờ rằng có thể gửi tin nhắn đến một đối tượng nil. Nó cắn tôi gần như hàng ngày ... ugh!
George Armhold

20
ObjC không 'giả vờ' OK để gửi tin nhắn đến con số không, bởi vì nó OK để gửi tin nhắn tới bằng không ...
Jasarien

1
Vấn đề ở đây không phải là con trỏ nil. Vấn đề là IB đã thiết lập một cá thể UIButton không được tham chiếu đúng cách trong mã (thông qua IBOutlet), vì vậy nó không bao giờ có thể được thao tác theo chương trình.
CIFilter

112

Tôi đã giải quyết vấn đề chỉ cần đặt tham số tiêu đề cho UIControlStateNormal và nó tự động hoạt động trên các trạng thái khác. Vấn đề dường như là khi bạn đặt một UIControlState khác.

[myButton setTitle: @"myTitle" forState: UIControlStateNormal];


13

Tôi phát hiện ra một vấn đề khác. Đó có thể là một lỗi được giới thiệu trong iOS 5, nhưng tôi nghĩ rằng tôi sẽ chỉ ra cho bất kỳ ai khác gặp phải.

Nếu bạn không đặt bất kỳ văn bản mặc định nào cho nút trong XIB, sẽ không có văn bản nào xuất hiện nếu bạn đặt nó theo chương trình. Và nếu bạn đặt văn bản trong XIB, bất kỳ văn bản nào sau đó bạn gán cho nút theo chương trình sẽ bị cắt bớt theo kích thước của văn bản mặc định.

Và cuối cùng, nếu bạn đang hiển thị chế độ xem bằng nút của mình, sau đó gọi một chế độ xem khác (như Biểu tính hành động) và sau đó loại bỏ nó, văn bản mà bạn đã gán cho nút theo chương trình sẽ bị xóa và chú thích nút sẽ trở lại bất kỳ thứ gì bạn đã đặt lên trong XIB.


1
Tôi đã nhận thấy cả ba hành vi này và nó chắc chắn là khó chịu.
Flea

2
Tôi đã gặp vấn đề về việc cắt bớt (thay đổi văn bản thành một thứ dài hơn theo lập trình), vì vậy tôi đặt thêm khoảng trắng ở cuối văn bản để 'dành' khoảng trống đó khi tôi thay đổi văn bản thành một từ dài hơn. Điều đó đã làm việc cho tôi.
mattorb

2
Có vẻ như cách khắc phục cho điều này là sử dụng phương thức [_button setTitle: @ "title" forState: UIControlStateNormal]; thay vì truy cập trực tiếp thuộc tính _button.titleLabel.text. Hãy gắn bó với lệnh gọi phương thức và có thể bạn sẽ nhận được những gì mình muốn.
Rymnel

12

Mặc dù vấn đề của Caffeine Coma đã được giải quyết, tôi muốn đưa ra một nguyên nhân tiềm ẩn khác khiến tiêu đề không hiển thị trên UIButton.

Nếu bạn đặt hình ảnh cho UIButton bằng cách sử dụng

- (void)setImage:(UIImage *)image forState:(UIControlState)state

Nó có thể bao gồm tiêu đề. Tôi phát hiện ra điều này một cách khó khăn và hãy tưởng tượng một số bạn đọc trang này vì lý do tương tự.

Sử dụng phương pháp này thay thế

- (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state

đối với hình ảnh nút và tiêu đề sẽ không bị ảnh hưởng.

Tôi đã thử nghiệm điều này với các nút được tạo lập trình và các nút được tạo trong tệp .xib


7

cho nhanh chóng:

button.setTitle("Swift", forState: UIControlState.Normal)                   

4

Hóa ra các tài liệu cho bạn biết câu trả lời! UIButton sẽ bỏ qua thay đổi tiêu đề nếu nó đã có Chuỗi thuộc tính để sử dụng (dường như là mặc định bạn nhận được khi sử dụng trình tạo giao diện Xcode).

Tôi đã sử dụng như sau:

[self.loginButton 
     setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Error !!!" attributes:nil] 
     forState:UIControlStateDisabled];
[self.loginButton setEnabled:NO];

3

Một nguyên nhân nữa có thể xảy ra là:

Nếu bạn cố gắng đặt tiêu đề của nút trong (id)initWithNibName: ...phương thức, thì thuộc tính nút của bạn sẽ vẫn là con số không. Nó vẫn chưa được gán cho UIButton.

Bạn phải chắc chắn rằng bạn đang đặt các nút của mình theo một phương pháp như (void)viewWillLoadhoặc (void)viewWillAppear, nhưng có thể bạn không muốn đặt chúng muộn như vậy (void)viewDidAppear.


2

Đôi khi nó có thể trở nên thực sự phức tạp. Cách dễ dàng là " làm mới " chế độ xem nút!

//Do stuff to your button here.  For example:

[mybutton setEnabled:YES];

//Refresh it to new state.

[mybutton setNeedsDisplay];

1

Tôi tiếp tục gặp vấn đề với điều này, giải pháp duy nhất là thêm một hình ảnh và nhãn dưới dạng các lượt xem phụ vào uibutton. Sau đó, tôi phát hiện ra rằng vấn đề chính là tôi đang sử dụng UIButton với tiêu đề: Attributed. Khi tôi thay đổi nó thành Plain, chỉ cần đặt titleLabel.text là đã thực hiện được thủ thuật!


1

@funroll hoàn toàn đúng. Ở đây bạn có thể thấy những gì bạn sẽ cần Đảm bảo rằng chức năng chỉ chạy trên luồng chính . Nếu bạn không muốn xử lý các chuỗi, bạn có thể làm như thế này, ví dụ: tạo NSUserDefaults và trong điều kiện cheking ViewDidLoad có được nhấn nút trong View khác hay không (trong tập View khác trong NSUserDefaults thông tin cần thiết) và tùy thuộc vào điều kiện đặt tiêu đề cần thiết cho UIButton của bạn, vì vậy [yourButton setTitle: @ "Title" forState: UIControlStateNormal];


Điều này rất hữu ích đối với tôi .. hóa ra nếu bạn gọi setTitle và setNeedsDisplay từ một chuỗi nền, Chế độ xem sẽ được cập nhật sau này.
user1111828

0

Đảm bảo rằng bạn đang ở trên chủ đề chính.

Nếu không, nó sẽ vẫn lưu văn bản nút. Nó sẽ ở đó khi bạn kiểm tra đối tượng trong trình gỡ lỗi. Nhưng nó sẽ không thực sự cập nhật chế độ xem.

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.