2012-01-10 12 views
10

Tôi đang bắt đầu với Xcode trên iOS 4.2 và có một vài thay đổi và hiện tại tôi đang gặp sự cố mà tôi không thể tìm ra cách giải quyết .Xcode 4.2 iOS 5: Nhiều phân đoạn từ UITableView

Tôi đang làm ví dụ với UITablwView được điền theo chương trình với 2 Phần, phần 1 chỉ có 1 Hàng và Phần 2 với 3 Hàng.

Mục tiêu của tôi là chọn một hàng từ bảng và dựa trên hàng đó, người dùng sẽ được chuyển hướng đến các Chế độ xem khác nhau.

Ví dụ: chọn phần 0 hàng 0, ứng dụng đẩy để xem 1 - Thiết lập tên // chọn phần 1 hàng 0, ứng dụng đẩy để xem 3 - địa chỉ thiết

Cách thời trang cũ, đây là khá đơn giản, chỉ cần thiết để bắt đầu một UIViewController với initWithNibName và sau đó đẩy xem.

Bây giờ với câu chuyệnHãy thay đổi mọi thứ, hoặc ít nhất tôi nghĩ nó thay đổi vì tôi không thể xem cách nhận kết quả tương tự vì tôi không thể đặt nhiều segue từ tableView thành UIViewControllers khác nhau ... và để làm cách thời trang cũ tôi không thể nhìn thấy nơi tôi có thể nhận được tên NIB từ các quan điểm trên storyBoard để khởi động một UIViewController để đẩy.

Có ai biết cách truy cập kết quả này không ??

Trả lời

25

Xác định hai phân đoạn "chung" (được xác định là "segue1" và "segue2", ví dụ) trong bảng phân cảnh từ bộ điều khiển chế độ xem nguồn, một cho mỗi bộ điều khiển chế độ xem đích. Những phân đoạn này sẽ không được liên kết với bất kỳ hành động nào.

Sau đó, có điều kiện thực hiện các segues trong UITableViewDelegate của bạn:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Conditionally perform segues, here is an example: 
    if (indexPath.row == 0) 
    { 
     [self performSegueWithIdentifier:@"segue1" sender:self]; 
    } 
    else 
    { 
     [self performSegueWithIdentifier:@"segue2" sender:self]; 
    } 
} 
+2

Fantastic trả lời. Làm việc cho tôi là tốt. Nên được chấp nhận làm câu trả lời. – mm24

16

Tôi có cùng một vấn đề như bạn. Vấn đề là bạn không thể liên kết tableViewCell với nhiều bộ điều khiển chế độ xem. Tuy nhiên, bạn có thể liên kết nguồn xem chính nó với nhiều bộ điều khiển xem.

  1. Control-kéo các điểm điều khiển chủ (thay vì tế bào xem bảng) từ người xem cảnh để bất cứ điều gì quan điểm điều khiển bạn muốn liên kết. Bạn có thể làm điều này nhiều như bạn muốn. Lưu ý rằng khoảng cách được hiển thị trong cảnh điều khiển chế độ xem nguồn phải giống như "Đẩy phân đoạn từ Bộ điều khiển chế độ xem gốc ..." thay vì "Đẩy phân đoạn từ NavCell sang ...".

  2. Xác định mỗi liên kết segue một tên độc đáo như "toDetailView1"

  3. Cuối cùng, tùy chỉnh các lựa chọn theo quan điểm điều khiển nguồn của bạn:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
        if (indexPath.row % 2 == 1) { 
         [self performSegueWithIdentifier:@"toDetailView1" sender:self]; 
        } else { 
         [self performSegueWithIdentifier:@"toDetailView2" sender:self]; 
        } 
    } 
    
+0

+1 đã giải quyết được sự cố của tôi –

+0

Tuyệt vời! Giải quyết vấn đề của tôi! Một câu hỏi ... Làm thế nào tôi có thể sử dụng cùng một điều cho hơn hai segues. Giả sử tôi có 7 ô tableView. Tôi sẽ sử dụng nó như thế nào ngoài mã bạn đã cung cấp? –

0

Giống như @ 陳仁 乾 và @Marco giải thích là hoàn toàn chính xác. Để làm mọi thứ dễ dàng hơn một chút, tôi khuyên bạn nên sử dụng một đơn NSArray sẽ được khởi tạo khi viewDidLoad.Chỉ cần đặt tên cho segues giống như UIViewControllers của bạn, bằng cách này bạn có thể hiển thị một mô tả chính xác về những gì UIViewControllers bạn có thể lựa chọn và bạn cũng có thể thực hiện các segues từ này NSArray:

(Trên thực tế tôi không chắc chắn nếu nó có thể gây ra bất kỳ vấn đề gọi segue giống như UIViewController bạn muốn gọi. Xin vui lòng cho tôi biết nếu điều này là BadPractise)

viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    _arraySessions = [[NSArray alloc] initWithObjects: 
         @"MyViewControllerName", nil]; 
} 

cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:@"overviewCell" 
            forIndexPath:indexPath]; 

    [cell.textLabel setText:_arraySessions[indexPath.row]]; 

    return cell; 
} 

didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView 
     didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [self performSegueWithIdentifier:_arraySessions[indexPath.row] 
           sender:self]; 
}