2010-01-08 29 views
29

Trong một nỗ lực dường như không bao giờ kết thúc để tìm hiểu thêm về phát triển iphone, tôi đã chơi xung quanh với một số mã nguồn có sẵn thông qua trang web của nhà phát triển táo. Ví dụ cụ thể mà tôi đang làm việc là Core Data Books, được tìm thấy here. Các DetailViewController, và AddViewController được thực hiện theo chương trình, bởi vì không có bất kỳ tập tin xib cho chúng. Câu hỏi của tôi là về cách thêm các thứ vào một cách có lập trình mà không cần sử dụng IB. Tôi muốn đặt một UISwitch bên dưới UITableView có thông tin chi tiết về một cuốn sách cụ thể trong DetailView. Làm thế nào để tôi làm điều này? Đây là những gì tôi đã cố gắng cho đến nay:Tạo một UISwitch Lập trình

Trong AddViewController, tôi thiết lập các UISwitch:

@interface AddViewController : DetailViewController { 
id <AddViewControllerDelegate> delegate; 
UISwitch *onoff; 

} 

@property (nonatomic, assign) id <AddViewControllerDelegate> delegate; 
@property (nonatomic, retain) IBOutlet UISwitch *onoff; 

Tôi cũng thiết lập một IBAction:

- (IBAction)flip:(id)sender; 

Sau đó, tôi tổng hợp nó trong AddViewController. m tập tin, nhưng không có gì xảy ra. Tôi chỉ cần thiết lập công tắc và làm cho nó để tôi có thể kiểm soát những gì nó làm từ IBAction của tôi mà tôi thiết lập. Tôi biết điều này thật đơn giản, nhưng tôi không thể hiểu được. Vì thế nên bất kỳ sự giúp đỡ nào cũng được đánh giá cao! Cảm ơn

Sửa 1

Vì vậy, tôi thực hiện các mã như tôi đã hướng đến trong viewDidLoad, như vậy:

- (void)viewDidLoad { 

[super viewDidLoad];  
    UISwitch *onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents:UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 

Và nó ném hai cảnh báo nói rằng việc khai báo địa phương của 'ONOFF' da biến cá thể. Nhưng mặc dù có những khoản thu nhập đó, UISwitch bật lên rất tốt, nhưng khi tôi di chuyển nó, hoặc sử dụng nó, có vẻ như nó không hoạt động đầy đủ. Đối với hành động của tôi trông giống như sau:

- (IBAction)flip:(id)sender { 
if (onoff.on) NSLog(@"On"); 
else NSLog(@"Off"); 
} 

Bất cứ khi nào nút bật, bảng điều khiển sẽ đọc và khi tắt, bảng điều khiển sẽ đọc. Đúng? Bất cứ lúc nào tôi di chuyển nó, nó chỉ lặp lại trong giao diện điều khiển, tắt. Nếu nó bật, hoặc nếu nó tắt, nó chỉ hiển thị ra. Tôi đang làm gì trên thế giới? Hãy giúp tôi! Cảm ơn

+0

Tại sao không sử dụng IB? Và nếu bạn không sử dụng nó, thì tại sao những thứ được khai báo là IBOutlet và IBAction? – gerry3

+0

Chà. Điểm tuyệt vời. Tôi thực sự rất thích sử dụng IB, nhưng như tôi đã đề cập, tôi đang cố gắng để có được điều này để làm việc trên một cái nhìn mà không sử dụng IB. Có cách nào dễ dàng để thêm một tập tin xib vào một màn hình chỉ là populating một uitableview và hiển thị các tế bào thông tin? Cảm ơn – Steve

Trả lời

29

Trình biên dịch đang cố gắng để giúp bạn ra ngoài. Bạn đang ghi đè biến phiên bản onoff trong viewDidLoad; do đó, điều đó không bao giờ được thiết lập. Trong phương thức -flip: bạn đang tham chiếu đến một bộ điều khiển nil. Có hai cách để sửa lỗi này:

(a) Loại bỏ tuyên bố của địa phương ONOFF, và chỉ sử dụng ví dụ của bạn biến

(b) Cast đối số người gửi đến -flip: như một UISwitch, và truy cập:

- (IBAction) flip: (id) sender { 
    UISwitch *onoff = (UISwitch *) sender; 
    NSLog(@"%@", onoff.on ? @"On" : @"Off"); 
} 
+0

Cảm ơn! Điều đó đã khắc phục được vấn đề của tôi. – Steve

16

Steve, tôi xin lỗi nếu tôi hiểu lầm câu hỏi của bạn. Bạn có thực sự tạo UISwitch và thêm nó vào phân cấp chế độ xem không? của bộ điều khiển của bạn -loadView hoặc -viewDidLoad thực hiện, nếu có mã như sau:

// Use the ivar here 
onoff = [[UISwitch alloc] initWithFrame: CGRectZero]; 
[onoff addTarget: self action: @selector(flip:) forControlEvents: UIControlEventValueChanged]; 
// Set the desired frame location of onoff here 
[self.view addSubview: onoff]; 
[onoff release]; 
+0

Xin cảm ơn rất nhiều vì sự giúp đỡ của bạn. Nó làm cho UISwitch xuất hiện, điều đó thật tuyệt vời!Tuy nhiên, nó có vẻ không hoạt động đầy đủ, vui lòng xem chỉnh sửa của tôi ở trên để biết mã. Cảm ơn – Steve

+0

Xin lỗi vì sai lầm ngu ngốc. Tôi đã sửa nó (xem bình luận của Ben Gottlieb). – Costique

+0

Đó là một câu trả lời tuyệt vời, hơn bạn rất nhiều @Costique! – cvursache