2010-01-14 28 views
5

Tôi nghĩ rằng tôi đang thiếu một cái gì đó cơ bản và vì vậy tôi muốn hỏi cộng đồng để được giúp đỡ. Tôi đang xây dựng một ứng dụng dựa trên một Ứng dụng Tiện ích iPhone cơ bản. MainView của tôi và FlipsideView chia sẻ một số yếu tố vì vậy tôi đã tạo ra ViewControllers và nib tập tin riêng biệt cho những phần. Để làm điều này tôi đã làm như sau: 1. Tạo một bộ điều khiển xem được gọi là searchDateViewController là chủ sở hữu tệp của searchDateView.xib 2. searchDateView.xib về cơ bản là một UIView với một UILabel bên trong, khung nhìn được nối đúng một cách chính xác 3. Bên trong cả hai MainViewController.m và FlipsideViewController.m Tôi thêm một subview như folllows:superview và ParentViewController nil sau khi thêm một subview

- (void)loadView{ 
    [super loadView]; 
    searchDateViewController = [[SearchDateViewController alloc] initWithNibName:@"SearchDateView" bundle:nil]; 
    [[searchDateViewController view] setFrame:[searchDateView frame]]; 
    [[self view] addSubview:[searchDateViewController view]]; 

... 
} 

Mọi thứ đều hiển thị và hoạt động tốt. Về cơ bản tùy thuộc vào hành động xảy ra trong mỗi quan điểm chính và flipside UILabel của ngòi được thay đổi. Tuy nhiên, tôi muốn làm một cái gì đó hơi khác nhau nếu searchDateViewController được tải từ MainView hoặc FlipsideView. Tuy nhiên, tôi dường như không thể tìm ra ViewController nào đang thêm subview searchDateViewController.

Trong searchDateViewController tôi đã cố gắng:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    NSLog(@"superview %@", self.view.superview); 
    NSLog(@"parentviewcontroller %@", self.parentViewController); 
} 

Trong cả hai trường hợp tôi nhận được nil.

Vì vậy, câu hỏi của tôi là - tôi có thể tìm hiểu xem ViewController nào đang thêm searchDateViewController vào một chế độ xem phụ không? Nếu thế thì sao? Hoặc nếu logic của tôi ở đây là hoàn toàn sai lầm, làm thế nào tôi nên làm điều này?

Cảm ơn!

Trả lời

2

viewDidLoad được gọi khi bộ điều khiển chế độ xem đã tải chế độ xem. Trong trường hợp của bạn, mà happends trong dòng này:

[[searchDateViewController view] setFrame:[searchDateView frame]]; 

Vào lúc đó, bạn vẫn chưa gọi là addSubview: nên nó không tự hỏi của xem SuperView là con số không.

Để giải quyết vấn đề của bạn, bạn nên xác định thuộc tính bên trong SearchDateViewController để phân biệt giữa các trường hợp khác nhau. Thuộc tính này sau đó sẽ được thiết lập cho phù hợp bởi bộ điều khiển cha để tạo ra cá thể SearchDateViewController.

Nói chung, tôi không nghĩ sử dụng lớp con UIViewController làm bộ điều khiển cho chế độ xem được sử dụng làm chế độ xem phụ của một hoặc nhiều chế độ xem toàn màn hình thay vì được sử dụng làm chế độ xem toàn màn hình. Phần lớn logic của UIViewController hoạt động dựa trên giả định rằng nó được sử dụng để quản lý chế độ xem toàn màn hình. Ví dụ, với thiết kế của bạn, tôi nghĩ rằng có thể SearchDateViewController sẽ sửa đổi khung của khung nhìn khi định hướng thiết bị thay đổi, v.v.Vì bạn không cần tất cả chức năng này cho một chế độ xem phụ không toàn màn hình, tôi khuyên bạn nên phân lớp SearchDateViewController của bạn trực tiếp từ NSObject.

+0

Được rồi, cảm ơn vì đã chỉ cho tôi đúng hướng về các bản phụ và các lớp con UIViewController. Nếu tôi làm cho SearchDateViewController một phân lớp của NSObject như thế nào mà sẽ ảnh hưởng đến cách tôi thêm các subviews và initing với nib? Tôi đã không tìm thấy bất kỳ ví dụ của subviews như nsobjects hơn là viewcontrollers nhưng tôi muốn bắt đầu áp dụng bất kỳ thực hành tiêu chuẩn là trong trường hợp này. Hãy cho tôi biết nếu bạn có thêm bất kỳ mẹo nào - cảm ơn! Ngoài ra - cả hai bạn đều đề xuất sử dụng bảng điều khiển cha mẹ, điều này có ý nghĩa, nhưng vai trò của superview sẽ phát? Điều đó có phù hợp hơn ở đây không? – deadroxy

+0

Làm cho SearchDateViewController một phân lớp của NSObject không loại bỏ vấn đề của bạn, nó chỉ tránh được các vấn đề trong tương lai vì UIViewControllers không thực sự được sử dụng cho các khung nhìn không chiếm toàn bộ cửa sổ IMHO. Để giải quyết vấn đề của bạn, mã tùy chỉnh chế độ xem của bạn không nên dựa vào self.parentViewController hoặc view.superview. Thay vào đó, hãy định nghĩa một thuộc tính trong SearchDateViewController (có thể là một BOOL hoặc một enum) mà bạn sau đó truy vấn để quyết định cách tùy chỉnh khung nhìn. Đối tượng tạo SearchDateViewController sẽ thiết lập thuộc tính. –

+0

Tôi đã làm như bạn đã nói tạo ra một tài sản trong lớp SearchDateViewController mà làm việc tốt. Tuy nhiên, tôi vẫn còn bối rối như thế nào để chuyển đổi từ đó được subclassed từ UIViewController để UIView/NSObject. Cụ thể ai sẽ trở thành chủ sở hữu của tệp SearchDateView? Tôi đã thử mọi cách và mọi thứ tôi đã thực hiện dẫn đến lỗi ... – deadroxy

-2

ViewController và chế độ xem hoàn toàn riêng biệt.

Trong hầu hết các trường hợp, khi bạn thêm chế độ xem phụ vào chế độ xem gốc, bạn không thêm bộ điều khiển của nó vào chế độ xem của phụ huynh. Ngoại lệ đối với quy tắc này là bộ điều khiển điều hướng bổ sung bộ điều khiển thay vì chế độ xem để duy trì một hệ thống phân cấp của bộ điều khiển chế độ xem.

Chế độ xem SearchDateTrình điều khiển không thể tìm thấy trình điều khiển chính vì bạn chưa bao giờ gán một bộ điều khiển và hệ thống không tự động làm điều đó. Bạn chỉ có thể gán một bộ điều khiển cha khi bạn gợi ý khung nhìn từ một bộ điều khiển khác.

searchDateViewController.parentController=self; 
+0

Hiểu biết của tôi là parentViewController chỉ sẵn sàng để tôi không thể đặt (thực tế là tôi gặp lỗi khi thử). – deadroxy

+0

Theo dõi nhanh - Tôi đoán bạn có thể có nghĩa là Ole đã tạo một thuộc tính mới bên trong SearchDateViewController để giữ thông tin này. Điều đó có hiệu quả, nhưng tôi vẫn còn lo lắng về những nhận xét của Ole về chiến lược này (sử dụng UIViewControllers như các bản phụ) nói chung chống lại các nguyên tắc thiết kế tốt ... – deadroxy

+0

Quyền của bạn chỉ được đọc. Tôi chỉ giả định nó đã được đọc/ghi vì bộ điều khiển chuyển hướng thiết lập thuộc tính. Tôi tự hỏi làm thế nào các bộ điều khiển chuyển hướng thiết lập các thuộc tính? Ole đúng là có nhiều bộ điều khiển trên cùng một màn hình hiển thị là thực hành không tốt. API không hỗ trợ dễ dàng. – TechZen

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