2012-09-01 14 views
9

Tôi hiện đang có một ứng dụng với hai bộ điều khiển xem. Đầu tiên là một bộ điều khiển xem với chế độ xem bảng được nhúng có các ô động. Thứ hai là một bộ điều khiển xem bảng với các ô tĩnh. Nếu tôi thêm một khoảng cách từ việc chọn một trong các ô của bảng động cho bộ điều khiển xem bảng tĩnh (sử dụng cài đặt kiểu Push hoặc Modal), tôi có thể thấy rằng segue hoạt động như mong đợi. Tuy nhiên, khi tôi thay đổi kiểu thành Popover, tôi nhận được lỗi biên dịch sau:Popover segue đến static cell UITableView gây ra lỗi biên dịch

Couldn't compile connection: <IBCocoaTouchOutletConnection:0x4004c75a0 <IBProxyObject: 0x400647960> => anchorView => <IBUITableViewCell: 0x400f58aa0>> 

Có ai khác gặp phải vấn đề này hay không ai biết thông báo lỗi này có ý nghĩa gì? Có vẻ lạ khi điều này xảy ra vào thời gian biên dịch trừ khi một bộ điều khiển xem bảng tĩnh không được hỗ trợ trong Popover ...

Trả lời

15

Tôi đã tìm ra cách thực hiện việc này. Bạn không thể móc nó lên từ kịch bản nhưng có thể làm điều đó theo chương trình như thế này:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" 
               bundle:nil]; 
    UITableViewController *detailController = [sb instantiateViewControllerWithIdentifier:@"TableSettingDetails"]; 

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:detailController]; 

    self.popoverController.popoverContentSize = CGSizeMake(320, 416); 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [self.popoverController presentPopoverFromRect:cell.bounds inView:cell.contentView 
          permittedArrowDirections:UIPopoverArrowDirectionAny 
              animated:YES]; 
} 

Chỉ cần chắc chắn rằng bạn có một tham chiếu đến popover của bạn trong điều khiển của bạn, nếu không nó sẽ nhận được ngay lập tức xử lý - gây ra một số khác ngoại lệ thú vị.

+0

Nhiều như tôi muốn điều này xảy ra trong bảng phân cảnh (IB) điều này đã làm việc một điều trị cho tôi, cảm ơn! – Joe

+0

Bài đăng rất hữu ích! Cảm ơn – Rahul

+0

Được thăng hạng là rất hữu ích nhưng không còn hợp lệ trong iOS 10 - Tôi đã thêm mã iOS 10 có liên quan làm câu trả lời riêng biệt, nhưng nếu bạn muốn kết hợp nó vào câu trả lời được chấp nhận, @ lehn0058, hãy tiếp tục và tôi sẽ xóa câu trả lời của tôi. – Grimxn

2

Bạn phải chọn một điểm neo cho Popover đó KHÔNG phải là ô tĩnh. Đề xuất của tôi là đặt UIButton được đặt thành ẩn (Loại tùy chỉnh). Sau đó chọn Popover Segue và kéo Anchor connection vào nút đó.

+0

Điểm neo cho cửa sổ bật lên là một trong các ô động. Khai thác ô đó là những gì sẽ trả về cửa sổ bật lên với bảng ô tĩnh. – lehn0058

+0

Tôi thấy rằng việc thêm nút vào chế độ xem chính và thiết lập đó là neo sẽ loại bỏ lỗi biên dịch, nhưng sau đó cửa sổ bật lên của tôi không trỏ đến ô chính xác trong bảng. Di chuyển nút đến ô sẽ gây ra lỗi biên dịch tương tự một lần nữa. – lehn0058

+0

Tại thời điểm này, bạn không thể neo cửa sổ bật lên đến ô xem bảng tĩnh. –

0

Vì iOS 10, câu trả lời chính xác và được chấp nhận của @ lehn0058 không còn hoạt động nữa. Đây là giải pháp của anh được cập nhật cho iOS 10 ...

override func tableView(_ tableView: UITableView, accessoryButtonTappedForRowWith indexPath: IndexPath) { 
    // *** Next line doesn't work with popover, only full screen detail 
    //self.performSegue(withIdentifier: "editRow", sender: self) 
    // Hence, do it by hand... 
    let sb = UIStoryboard(name: "Main", bundle: nil) 
    let detailVC: MyDetailViewController = sb.instantiateViewController(withIdentifier: "itemEditor") as! MyDetalViewController 
    detailVC.modalPresentationStyle = .popover 
    detailVC.popoverPresentationController?.sourceView = tableView.cellForRow(at: indexPath) 
    detailVC.detailItem = self.itemAtIndexPath(indexPath) 

    self.present(detailVC, animated: true, completion: {}) 
}