5

Tôi đang làm việc trên ứng dụng iOS sử dụng chế độ xem bảng dựa trên Dữ liệu cốt lõi rất phổ biến để hiển thị các mục và khi mục được chọn, nó hiển thị chế độ xem chi tiết hơn, giống như Ứng dụng Danh bạ. Khung nhìn chi tiết chính nó là một bảng được tạo theo nhóm được lập trình với một khung nhìn tùy chỉnh (nib-defined) cho một tiêu đề có một hình ảnh và một tên. Một số ô trong bảng là các ô tùy chỉnh có tên nhãn và giá trị hộp văn bản. Trong chế độ "chỉnh sửa", các ô bảng có thể chỉnh sửa (và tên trong tiêu đề) có .clearButtonMode được đặt thành UITextFieldViewModeAlways để cho biết rằng chúng có thể chỉnh sửa được.Sử dụng cùng một Trình điều khiển Chế độ xem để thêm, hiển thị và chỉnh sửa

Tôi hiện đang sử dụng cùng một bộ điều khiển chế độ xem để hiển thị thông tin chi tiết, chỉnh sửa thông tin và thêm bản ghi mới vào danh sách gốc.

Khi một mục mới đang được thêm vào, bộ điều khiển chế độ xem được tạo theo phương thức với quá tải init tùy chỉnh đặt cờ trong bộ điều khiển chế độ xem để cho biết rằng nó đang thêm bản ghi. Điều này cho phép nó bắt đầu ở chế độ chỉnh sửa và nếu chế độ chỉnh sửa bị bỏ lại, chế độ xem mô hình sẽ bị loại bỏ. Nút thanh menu bên phải là Chỉnh sửa/Xong thông thường và nút bên trái là nút hủy. Khi một mục hiện có đang được chỉnh sửa, nút trái (nút quay lại bình thường) được thay thế bằng nút hủy.

Tôi bắt đầu có suy nghĩ thứ hai về việc có hay không có một bộ điều khiển chế độ xem xử lý ba chế độ khác nhau là cách để thực hiện. Có vài vấn đề mà tôi không chắc chắn làm thế nào để xử lý.

1) Làm cách nào để biết liệu chế độ chỉnh sửa có được để lại bằng cách nhấn "Xong" không? Có một hành động cho nó? Nếu hủy bỏ được nhấn, hành động hoặc loại bỏ chính nó (thêm chế độ) hoặc khôi phục các giá trị trước đó lá chế độ chỉnh sửa. Tôi cho rằng tôi có thể đặt một kiểm tra trong ghi đè setEditing của tôi để xử lý nó, nhưng có vẻ như phải có một cách tốt hơn.

2) Khi chế độ chỉnh sửa được nhập và tôi đặt trường văn bản có thể chỉnh sửa thành UITextFieldViewModeAlways, có cách nào để tạo hoạt ảnh cho các nút 'X' để chúng mờ dần với các chỉ báo chỉnh sửa trên các ô thông thường không?

Có giải pháp dễ dàng cho những vấn đề này hoặc bộ điều khiển chế độ xem 3 trong 1 của tôi có ý tưởng tồi không? Nó có vẻ không phải để làm lại cùng một chế độ xem cho các chế độ khác nhau, nhưng có nhiều chế độ cho một bộ điều khiển xem có vẻ là một chút rắc rối.

jorj

Trả lời

1

tôi đã không hiểu đầy đủ các câu hỏi mà bạn đã nêu ra, nhưng đây là một vài suy nghĩ về cấu trúc mà có lẽ hữu ích hơn trong trường hợp đầu tiên ...

Có vẻ như bạn đang làm quá nhiều với một UITableViewController duy nhất và chắc chắn bạn sẽ kết thúc với rất nhiều câu lệnh if và mã khó hiểu. Tôi muốn chia nhỏ nó thành hai UITableViewControllers riêng biệt, một để xử lý khung nhìn chính (và bất kỳ chế độ chỉnh sửa tiếp theo nào mà bạn yêu cầu) và một chế độ khác để xử lý khung nhìn chi tiết. Hoặc là cả hai hoặc sau đó có thể sử dụng ngòi như bạn yêu cầu.

Sử dụng hai bộ điều khiển như thế này sẽ cho phép bạn chỉ cần đẩy chi tiết thứ haiViewController vào ngăn xếp điều hướng, thay vì hiển thị nó theo phương thức mà dường như không hiển nhiên trong ví dụ này.

Tuy nhiên, nếu bạn muốn nó được trình bày một cách bình thường, bạn có thể viết giao thức cho detailView gửi thư trong trường hợp các nút 'Hủy', 'Chỉnh sửa' hoặc 'Xong' được đẩy. ViewController đầu tiên sau đó có thể thực hiện giao thức và nhận các sự kiện này.

Tôi hy vọng điều đó sẽ giúp ...

3

Tôi thích phương pháp 3 trong 1 và sử dụng nó mọi lúc.Có rất nhiều lợi thế: một xib, một bộ điều khiển xem, một giao thức đơn giản giữa danh sách và bộ điều khiển xem chi tiết. Có, có một vài kiểm tra khác như if (self.editing) ... nhưng tôi thích điều đó tốt hơn nhiều bộ điều khiển chế độ xem và xib.

Để trợ giúp với việc thêm tôi, hãy hiển thị BOOL mà đại biểu có thể đặt.

@property (nonatomic) BOOL adding; 

1) EditButtonItem cài sẵn không cho phép bạn chặn trước khi chỉnh sửa Chỉnh sửa: động: Đây là vấn đề khi bạn thực hiện xác thực dữ liệu sau khi Xong được nhấn. Vì lý do đó, tôi hiếm khi sử dụng editButtonItem và sử dụng các nút Chỉnh sửa, Xong và Hủy của riêng mình bằng các phương thức hành động của riêng mình. Xem bên dưới.

2) Đối với điều này tôi thích phần tải lại của UITableView: withRowAnimation. Nó có thể làm việc trong trường hợp của bạn.

- (void)edit:(id)sender 
{ 
    self.editing = YES; 
} 
- (void)done:(id)sender 
{ 
    // data validation here 
    if (everythingChecksOut) 
    { 
     //save here 
    } else { 
     return; //something didn't validate 
    } 

    //if control reaches here all is good 
    //let the delegate know what happened... 
    if (self.adding) { 
     [self.delegate didFinishAddingWithData:self.yourData]; 
    } else { 
     [self.delegate didFinishEditingWithData:self.yourData]; 
    } 

    self.adding = NO; 
    self.editing = NO; 
} 
- (void)cancel:(id)sender 
{ 
    [self.view endEditing:YES]; //in theory, forces the view that is editing to resign first responder 
    //in practise I find it doesn't work with the YES parameter and I have to use my own flag 

    // roll back any changes here 

    self.editing = NO; 

    if (self.adding) //let the delegate know we cancelled the add... 
    { 
     [self.delegate didCancelAdd]; 
    } 
} 
- (void)setEditing:(BOOL)editing animated:(BOOL)animated 
{ 
    [super setEditing:editing animated:animated]; 

    //set your nav bar title 
    [self.tableview.editing = editing]; //you may or may not require this 
    [self.tableview reloadSections... withRowAnimation:yourChoice]; 

    if (editing) 
    { 
     //install your Done and Cancel buttons 
    } else { 
     //remove Cancel and put the Edit button back 
    } 
} 

Sau đó, trong viewDidLoad ...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    //whatever else you do 

    if (self.adding) 
    { 
     self.editing = YES; 
    } 
} 
Các vấn đề liên quan