2012-06-29 30 views
10

Tôi tương đối mới với Objective-C và tôi đến từ một nền Java, do đó tôi tìm thấy khái niệm về con trỏ và các lỗi biên dịch không giải thích được khá khó khăn.Truy cập thuộc tính trong PrepareForSegue của một UIViewController

Tôi có một lớp thực hiện một đại biểu với phương thức jsonControllerDidLinkedInAuth. Bất cứ khi nào người ủy nhiệm gửi một thông điệp tới lớp này, đi qua chính nó và một (NSURL *) url, tôi đang cố gắng để gán url để một tài sản authUrl, khi điều này hoạt động kết thúc gọi performSegueWithIdentifier, mà trong thực thi lần lượt các preparForSegue (theo như sự hiểu biết của tôi về điều này là có liên quan).

này dường như không làm việc, như tôi nhận được:

App [3278: 13.517] * Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInvalidArgumentException', lý do: '- [UINavigationController setUrlAddress :]: chọn không được công nhận gửi đến dụ 0x6acab00'

thông báo lỗi chấm dứt các ứng dụng với SIGABRT.

Cả hai phương thức đều nằm trong cùng một lớp, là một UINavigationController và trỏ đến một UINavigationController khác. Trình biên dịch chỉ cho tôi số [vc setUrlAddress:self.authUrl]; của phương pháp thứ hai.

- (void)jsonControllerDidLinkedInAuth:(JsonController *)controller :(NSURL *)url { 
    authUrl = url; 
    if (authUrl != nil) { 
     [self performSegueWithIdentifier:@"LinkedInAuth" sender:self]; 
    } else { 
     NSLog(@"Auth URL is null"); 
    } 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
     // Get destination view 
     LinkedInViewController *vc = [segue destinationViewController]; 
     NSLog(@"The auth url from prepareForSegue in SignupViewControlle: %@", self.authUrl); 
     [vc setUrlAddress:self.authUrl]; 
    } 
} 

Có vẻ như vấn đề là vì một lý do nào đó tôi không thể truy cập thuộc tính authUrl của lớp tôi hiện đang ở. Tôi đã thử với authUrl, [self authUrl] và self.authUrl nhưng không ai trong số này dường như thực hiện công việc. Thuộc tính được tổng hợp, nhưng tôi cũng đã nhận thấy một chút gợi ý: "UINavigationController setUrlAddress", đây không phải là LinkedInViewController như được định nghĩa trong phương thức trên? Tôi đã cố gắng đúc (LinkedInViewController) [segue destinationViewController], nhưng sau đó tôi nhận được một thông báo thông báo cho tôi rằng bạn không thể cast lên một con trỏ.

Mọi trợ giúp sẽ được đánh giá cao. Cảm ơn vì đã đọc.

Chỉnh sửa 1: NSLog ngay phía trên hàm setUrlAddress trả về self.authUrl. Tôi giả định nó phải là một vấn đề tầm nhìn nào đó, nhưng tôi không chắc cách giải quyết vấn đề này.

Trả lời

21

Nếu bộ điều khiển chế độ xem của bạn được nhúng trong UINavigationController, segue.destinationViewController là bộ điều khiển điều hướng. Đây là những gì bạn có thể sử dụng:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

     if ([[segue identifier] isEqualToString:@"LinkedInAuth"]) { 
      UINavigationController *navigationController = (UINavigationController *)segue.destinationViewController; 
      LinkedInViewController *linkedInViewController = [[navigationController viewControllers] lastObject]; 
      linkedInViewController setUrlAddress:self.authUrl]; 
     } 
} 

Và nếu bạn có nhiều hơn 1 segue đó chuyển tiếp đến một bộ điều khiển xem được nhúng trong một UINavigationController, tôi thường thêm video này vào đầu prepareForSegue:sender:

if ([segue.destinationViewController isKindOfClass:[UINavigationController subclass]]) 
     id vc = [[(UINavigationController *)segue.destinationViewController viewControllers] lastObject] 

Bây giờ vc chứa bộ điều khiển chế độ xem mà bạn thực sự quan tâm, do đó bạn không phải sao chép và dán phép đúc cho mỗi khoảng cách.

+0

Cảm ơn bạn, điều này hoạt động như một sự quyến rũ!Ngoài ra, tin nhắn của bạn đã lưu cho tôi rất nhiều gỡ lỗi vì có rất ít ViewControllers khác sẽ hoạt động theo cách tương tự. –

+0

Bạn được chào đón. Xem câu trả lời cập nhật của tôi cho một cách dễ dàng để truy cập vào bộ điều khiển xem mà bạn quan tâm mà không cần phải cast mỗi lần. –

0

Có vẻ như bạn đang chỉ định đại biểu, bạn cần phải làm gì để mô hình đại biểu hoạt động. Hãy thử thêm vc.delegate = self vào PrepareForSegue của bạn.

+0

Các đại biểu được giao trong một phương pháp khác mà bắt đầu xác thực, sau đó các đại biểu (không được hiển thị trong đoạn mã của tôi) được gọi là jsonControllerDidLinkedInAuth :, nhưng cảm ơn bạn anyway :) Vấn đề của tôi liên quan đến ViewController của tôi được nhúng trong một NavigationController, như chỉ bởi Scott. –

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