2012-04-18 31 views
5

Tôi đang phát triển ứng dụng Ipad có chế độ xem chia tách tùy chỉnh. Trong chế độ xem chủ, tôi có một tableViewController. Tôi thêm các mục trong mục này bằng nút thêm trong thanh điều hướng. Nút này được liên kết (tôi làm việc với bảng phân cảnh) với một phân đoạn popover đến một tableViewController khác có chứa một vài ô để nhập dữ liệu. Nút “lưu” loại bỏ chế độ xem cửa sổ bật lên một mục bổ sung trong danh sách chế độ xem chính. Điều tôi muốn làm tiếp theo là các ô mẫu chính của chế độ xem liên kết đến chế độ xem khác để cho phép người dùng chỉnh sửa mục đã chọn. Tôi muốn liên kết chế độ xem này với một phân đoạn cửa sổ bật lên (giống như nút thêm) và ở đó có problème: Tôi gặp sự cố màu đỏ từ xcode: Không thể biên dịch kết nối: => anchorView =>>.Hiển thị chế độ xem cửa sổ bật lên từ các ô mẫu thử động

Đây là mẫu mã của tôi hoạt động tốt. Tôi muốn làm khá giống nhau khi tôi chạm vào một ô để chỉnh sửa.

Bảng masterSplitView

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"assetCell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    // Configure the cell... 
    AssetModel *myAssetModel = [self.arrayAsset objectAtIndex:indexPath.row]; 
    cell.textLabel.text = myAssetModel.name; 
    // cell.textLabel.text = @"test"; 

    return cell; 

} 

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

    if([segue.identifier isEqualToString:@"addAssetSegue"]){ 
     AddAssetTVC *addAssetTVC = segue.destinationViewController; 
     addAssetTVC.delegate = self; 

     UIStoryboardPopoverSegue* popoverSegue = (UIStoryboardPopoverSegue*)segue; 
     [addAssetTVC setPopoverController:[popoverSegue popoverController]]; 

    } 

} 

- (void) theSaveButtonOnTheAddAssetTVCWasTapped:(AddAssetTVC *)controller{ 
    [controller.navigationController popViewControllerAnimated:YES]; 
    [self reloadCache]; 
    [self.tableView reloadData]; 
    [self viewDidLoad]; 
} 

Và phương pháp tiết kiệm của view add:

- (IBAction)save:(id)sender{ 
    [popoverController dismissPopoverAnimated:YES]; 
    NSLog(@"Telling the ADDASSET Delegate that Save was tapped on the AddAssetTVC"); 

    {...unrevelant coredata methods} 

    [self.delegate theSaveButtonOnTheAddAssetTVCWasTapped:self]; 
} 

Cảm ơn bạn đã đọc,

Alexandre

Trả lời

4

tôi đã cùng một vấn đề. Giải quyết nó bằng cách sử dụng một segue tùy chỉnh. Trong phương pháp prepare của lớp:

  1. Grab quan điểm điều khiển nguồn đó là một trong hai bộ điều khiển tùy chỉnh hoặc một bộ điều khiển UITableViewController
  2. Grab điểm đến
  3. Tạo một UIPopoverController khởi tạo với bộ điều khiển điểm đến
  4. Lấy tế bào của hàng hiện đang được chọn
  5. Lưu cửa sổ bật lên dưới dạng thuộc tính trên bộ điều khiển đích (theo cách đó bạn có thể loại bỏ nó và nó sẽ không được deallocated)
  6. Trình bày popover sử dụng của frame tế bào như CGRect
  7. Đặt kích thước của popover vì nó sẽ được tối đa kích thước khác

Dưới đây là một số mẫu mã:

UITableViewController *tvc = (UITableViewController *)self.sourceViewController; 
DetailsViewController *details = (DetailsViewController *)self.destinationViewController;  
UITableViewCell *cell = [tvc.tableView cellForRowAtIndexPath:[tvc.tableView indexPathForSelectedRow]]; 

UIPopoverController *pop = [[UIPopoverController alloc] initWithContentViewController:details]; 

details.popoverController = pop; 

CGSize size = CGSizeMake(640, 460); 
pop.popoverContentSize = size; 


[pop presentPopoverFromRect:cell.frame 
        inView:tvc.tableView 
    permittedArrowDirections:UIPopoverArrowDirectionUp | UIPopoverArrowDirectionDown 
        animated:YES]; 
+0

Điều này thật tuyệt vời. Cảm ơn bạn. – user216661

+0

Hoạt động tuyệt vời ngoại trừ 'popoverController' không được dùng nữa. Đã nhân bản mã trong câu trả lời dưới đây với 'popoverPresentationController' trong Swift. – Santhosh

0

tôi đã có thể để làm điều này với mã hóa tối thiểu. Hãy thử điều này:

  1. Tôi đã thêm nút vào Thanh công cụ hoặc Thanh điều hướng của mình. Đây là một nút giả sẽ là Anchor cho Popover của bạn. Tắt nút (bỏ chọn Bật). Bạn sử dụng cùng một nút cho nhiều lần xem bảng. Tôi sử dụng hình ảnh biểu tượng tổ chức trong nút để mô phỏng chi tiết hoặc bạn có thể đặt hình ảnh hoặc tiêu đề tùy chỉnh cho từng phương thức didSelectRowAtIndex trước khi gọi performSegueWithIdentifier ... Giải thích sau ...
  2. Sau đó kết nối nút với Popover của bạn lượt xem. Rõ ràng đặt loại thành Cửa sổ bật lên
  3. Nhấn vào mũi tên Phân đoạn và đặt tên cho Phân đoạn, cho ví dụ này: "SegToDetail".
  4. Bây giờ trong mã Master/Parent với tableview thêm phương thức, didSelectRowAtIndex ... Trong phương thức đó bạn có thể đặt nút trông như thế nào.Quan trọng nhất là bạn gọi: [self performSegueWithIdentifier: @ "SegToDetail" ... Và đó là ...
  5. Bây giờ bạn có thể chuyển bất kỳ thông tin nào trong các phương thức PrepareForSegue như trong bất kỳ quá trình chuyển đổi segue nào.
0

Dựa trên câu trả lời của @ Rich nhưng với PopoverPresentationController và trong Swift.

override func perform() { 
    let svc = self.sourceViewController as! yourSourceViewController 
    let pvc = self.destinationViewController as! yourPresentedViewController 

    // Present the view controller using the popover style 
    pvc.modalPresentationStyle = UIModalPresentationStyle.Popover 
    svc.presentViewController(pvc, animated: true, completion: nil) 

    // Get the popover presentation controller and configure it 
    let cell = svc.tableView.cellForRowAtIndexPath(svc.tableView.indexPathForSelectedRow!) 
    let presentationController = pvc.popoverPresentationController 
    presentationController!.permittedArrowDirections = .Any 
    presentationController!.sourceView = svc.tableView 
    presentationController!.sourceRect = cell!.frame 
} 
Các vấn đề liên quan