2009-06-26 33 views
12

Trong phương pháp viewDidLoad của UIViewController, tôi làm điều này:Tại sao không hiển thị tiêu đề UIButton?

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b];      // EDIT: should be 'b' 
NSLog(@"button title: %@", [b titleLabel].text); 

Nút hiển thị nhưng danh hiệu thì không. Dòng NSLog in "Thử nghiệm" cho bàn điều khiển. Bất kỳ đề xuất về những gì tôi đang làm sai?

+0

Hai ý tưởng: * Điều gì sẽ xảy ra nếu bạn làm cho nút của mình lớn hơn? * Bạn có đang làm gì khác trong viewDidLoad có thể ảnh hưởng đến nút không? – JonathonW

+0

Vui lòng xem giải pháp của người chết dưới đây vì nó mô tả lỗi trong bộ khởi tạo kép được sử dụng ở trên cũng như sửa lỗi cho nó, để gán khung riêng biệt, sau khi khởi tạo tiện ích [... với loại ...] hoàn thành. Phần còn lại của giải pháp riêng của OP là chính xác và vẫn giữ nguyên. – eGanges

Trả lời

38

Tôi không thể cho bạn biết lý do tại sao nó không hoạt động, nhưng tôi có một giải pháp:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect] ;   
b. frame = CGRectMake(0, 0, 100, 100); 

[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self addSubview:b]; 

riêng biệt tạo khung từ việc phân bổ và init của nút.

+0

Tôi đồng ý. Tôi đặt cược chaining hai initializers với nhau như bạn đang làm là gây ra một số vấn đề. Sử dụng buttonWithType rồi đặt khung. – LucasTizma

+1

setTitle đã làm điều đó, nhờ – Eugene

+0

Vâng, 'buttonWithType' là một phương thức nhà máy tĩnh trả về một nút được khởi tạo hoàn toàn. Bạn không thể gọi 'initWithFrame' trên một nút đã được khởi tạo (kết quả là không xác định tốt nhất). Các phương thức 'init' chỉ được dùng để gọi sau' alloc'. – devios1

4

Làm điều này thay vì:

UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
b.frame = CGRectMake(0, 0, 100, 100); 
[b setTitle:@"Testing" forState:UIControlStateNormal]; 
[b setTitleColor: [UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
22

Vấn đề nằm với

UIButton *b = [[UIButton buttonWithType:UIButtonTypeRoundedRect] 
             initWithFrame:CGRectMake(0, 0, 100, 100)]; 

buttonWithType trả về một đối tượng khởi tạo autoreleased. Bạn không thể gửi lại initWithFrame như một đối tượng chỉ có thể được khởi tạo một lần.

Đặt khung của nó riêng biệt:

b.frame = CGRectMake(0, 0, 100, 100); 
0

Vấn đề là bạn phải đi cho [[UIButton alloc] initWithFrame:] hoặc [UIButton buttonWithType:], bạn không nên sử dụng cả hai cùng lúc.

0

Bạn có thể làm như sau:

UIButton *b=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)]; 

b=[UIButton buttonWithType:UIButtonTypeRoundedRect];

[b setTitle:@"Button Title Here" forState:UIControlStateNormal]; 
[b setTitleColor:[UIColor blackColor] forState: UIControlStateNormal]; 
[self.view addSubview:b]; 
0

tôi đã cùng một vấn đề và nó kết thúc lên được một thực tế rằng tôi đã thiết lập các hình ảnh chứ không phải là backgroundImage. Tất cả đều hoạt động tốt khi tôi đã làm:

[button setBackgroundImage:image forState:UIControlStateNormal]; 
Các vấn đề liên quan