6

Tôi đang làm việc trên một ứng dụng mà phần lớn giao diện người dùng được thiết lập thông qua Bảng phân cảnh trong Xcode. Một điều mà tôi muốn làm là chỉ định "Hoàn thành" hình ảnh cho các UITabBarItems trên một TabBar chứ không phải là mặc định "Stencilled" hình ảnh mà bạn có thể truy cập thông qua giao diện Builder.Đặt hình ảnh TabBar đã hoàn thành khi sử dụng bảng phân cảnh?

Câu hỏi của tôi là nơi tốt nhất để làm điều này, tôi hiện đang làm điều đó trong awakeFromNib vì nó cần phải được thực hiện khi mọi thứ bị hủy lưu trữ khỏi bảng phân cảnh, nhưng tôi không chắc liệu tôi có nên sử dụng initWithCoder không: đó là vấn đề gì tốt nhất?

- (id)initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if(self) { 
     UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"]; 
     UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"]; 

     UITabBarItem *tabBarItem = [self tabBarItem]; 
     [tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn]; 
     [tabBarItem setTitle:@"TWO"]; 
    } 
    return self; 
} 

HOẶC

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"]; 
    UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"]; 

    UITabBarItem *tabBarItem = [self tabBarItem]; 
    [tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn]; 
    [tabBarItem setTitle:@"TWO"]; 
} 

Tôi hiểu rằng initWithCoder: được gọi vào lúc bắt đầu của các đối tượng hủy lưu trữ từ ngòi (chứa trong storyboard) khi các cửa hàng và các hoạt động chưa được nối. Tôi cũng hiểu rằng awakeFromNib được gọi vào cuối quá trình hủy lưu trữ và các tín hiệu mà viewController hiện đã sẵn sàng để sử dụng. Cảm giác của tôi là nó thực sự chỉ phụ thuộc vào những gì bạn muốn làm, mặc dù sử dụng awakeFromNib có thể chứng minh ít vấn đề như bạn sẽ không nhấn vấn đề nơi các cửa hàng và hành động chưa được nối.

EDIT:

Hãy để tôi nói lại này, những gì tình huống bạn sẽ sử dụng initWithCoder: đối lập với sự awakeFromNib và ngược lại?

Trả lời

2

Dường như bạn đã trả lời câu hỏi của riêng mình trong đoạn trước khi chỉnh sửa.

Các documentation bang mà

Khi một đối tượng nhận được một thông báo awakeFromNib, nó được đảm bảo để có tất cả các biến Ví dụ ổ cắm của nó đặt.

Vì vậy, nếu bạn phải truy cập IBOutlet ivars trong mã khởi tạo, bạn phải thực hiện theo phương pháp awakeFromNib.

Mặc dù tôi thích initWithCoder: trong những trường hợp khi tôi không cần phải truy cập vào cửa hàng vì nó là phương pháp initialiser thích hợp cho các đối tượng được giải mã với NSCoding giao thức theo NSCoding documentation:

initWithCoder: chỉ thị các đối tượng để khởi tạo bản thân từ dữ liệu trong bộ mã được cung cấp; như vậy, nó thay thế bất kỳ phương pháp khởi tạo khác và chỉ được gửi một lần cho mỗi đối tượng

Như một mặt lưu ý, mặc dù nó không làm cho nhiều sự khác biệt và trong những trường hợp khi tôi có đến các đại lý truy cập trong khởi của tôi mã, tôi không triển khai cả hai awakeFromNibinitWithCoder: vì mục đích đơn giản. Vì vậy, nếu các cửa hàng có liên quan tôi thường thực hiện awakeFromNib và làm tất cả các initialisation đó.

+0

Cảm ơn Egor, được đánh giá cao. – fuzzygoat