2015-02-05 24 views
12

Tôi muốn biết làm thế nào để truy cập vào một @IBOutlet khai báo trong một lớp từ một lớp khácLàm thế nào để truy cập vào một IBOutlet từ một lớp

ví dụ, tôi có một lớp có tên myfirstview

class MyFirstView: UIViewController { 

    @IBOutlet var lblred: UILabel! = UILabel() 
} 

Tôi muốn thay đổi nội dung của lblred từ một lớp có tên MySecondView được viết trong tập tin khác .swift:

class MySecondView: UIViewController { 

    func modify() { 
     let mfv = MyFirstView() 
     mfv.lblred.text = "Hello" 
    } 
} 

Nhưng không có gì happe ns.
Tôi đã kết nối lblred với nhãn bảng phân cảnh. Tôi đã tìm kiếm rất nhiều về điều này trên web nhưng tôi không thể tìm thấy một trong đó có thể giải quyết vấn đề của tôi. Xin hãy giúp tôi giải quyết vấn đề này.

Cảm ơn bạn.

+0

xin định dạng mã –

Trả lời

4

Vấn đề là ở đây:

var lblred : UILabel! = UILabel() 

Bạn tạo một nhãn mới đây. Điều đó phá vỡ kết nối IBOutlet của bạn. Bạn chỉ cần

@IBOutlet var lblred : UILabel! 
+0

@cjwirth, Cảm ơn –

+1

Khi tôi làm điều đó, kết quả cho thấy điều này: lỗi nghiêm trọng: bất ngờ tìm thấy con số không trong khi unwrapping một giá trị bắt buộc –

+0

Nó cho thấy lỗi mà IBOutlet không có loại UILabel tùy chọn. Tuy nhiên, cảm ơn bạn đã giúp tôi –

0

Đây không phải là cách được khuyến nghị để gọi IBOutlet từ một lớp khác. Nếu bạn muốn gọi hoặc truy cập IBOutlet thì bạn nên đặt nó làm tài sản và sau đó truy cập nó.

Ví dụ:

//ViewControler.h 

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UILabel *label; 

@end 

//abc.m 

#import <UIKit/UIKit.h> 
#import <ViewController.h> 

@interface abc 

@end 

@implementation abc 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
ViewController *viewCOntroller= [ViewController alloc] init]; 
viewCOntroller.label.text = @"Hello"; 
} 
13

@Sheen là đúng về vấn đề trước mắt của bạn, nhưng vấn đề của bạn là sâu sắc hơn. Không có đối tượng nào nên truy cập IBOutlets của đối tượng khác. Nó không được xác định rõ những gì sẽ xảy ra. Đây là một nguồn lỗi lâu dài trong mã ObjC, và Swift leo thang những lỗi phổ biến đó.

IBOutlets không được chỉ định cho đến khi lượt xem được tải. Điều này có nghĩa rằng nếu bộ điều khiển xem được cấp phát nhưng chưa được đặt trên màn hình, các IBOutlet vẫn là không. Truy cập một nil ngầm chưa được mở sẽ sụp đổ Swift.

Bộ điều khiển xem chỉ nên liên lạc với con cái của họ xem bộ điều khiển. Họ không nên giao tiếp với bộ điều khiển xem tùy ý trong hệ thống. Giao tiếp giữa các bộ điều khiển xem tùy ý được thực hiện thông qua mô hình. Một bộ điều khiển xem sẽ cập nhật mô hình và một bộ điều khiển chế độ xem khác đọc từ mô hình. Đây là mẫu Model-View-Controller mà hầu hết Cocoa được xây dựng xung quanh.

Xem bộ điều khiển có thể tương tác trực tiếp hơn với con cái, nhưng vẫn không được sửa đổi trực tiếp IBOutlets. Họ nên thiết lập các thuộc tính. Trách nhiệm của bộ điều khiển xem trẻ em là di chuyển dữ liệu đó từ thuộc tính tới nhãn vào đúng thời điểm (có thể phải đợi đến viewDidLoad()). Đó là lý do tại sao nó được gọi là "bộ điều khiển xem." Nó là một đối tượng chịu trách nhiệm cho quan điểm của nó. Không ai khác nên gây rối với họ.

+0

, Bạn là chính xác. Cảm ơn. –

Các vấn đề liên quan