2012-03-20 35 views
7

Tôi đang viết bộ điều khiển chế độ xem để thêm mục mới vào ứng dụng của mình. Nó hoàn toàn phù hợp cho MonoTouch.Dialog, vì nó có thể được thực hiện dễ dàng với một giao diện dựa trên bảng, với một trường cho mỗi thuộc tính có liên quan của mục của tôi.Làm cách nào để đóng gói một chế độ xem MonoTouch.Dialog thành bộ điều khiển chế độ xem?

Đây là mã Tôi hiện có cho thấy quan điểm add item (giản thể, nhưng ý tưởng cốt lõi vẫn là):

Item item = new Item(); 
TapHandler handler = new TapHandler(); 
BindingContext bc = new BindingContext(handler, item, "Add Item"); 
DialogViewController dv = new DialogViewController(bc.Root, true); 
this.NavigationController.PushViewController(dv, true); 

Trong khi làm việc, tôi muốn nếu tôi có thể tóm lược các chi tiết của view vào bộ điều khiển chế độ xem của riêng nó, vì vậy mã có thể trông giống như sau:

UIViewController controller = new AddItemViewController(); 
this.NavigationController.PushViewController(controller, true); 

Tuy nhiên, tôi không thể tìm ra cách thực hiện điều này. Tôi nghĩ điều hợp lý cần làm là tạo một lớp con của DialogViewController. Tuy nhiên, tất cả các nhà thầu của DialogViewController đều yêu cầu RootElement. Để làm được điều đó, trước hết bạn cần tạo BindingContext. Vì bạn không thể chạy bất kỳ mã nào trước khi gọi hàm tạo cơ sở, nó không hoạt động.

tiếp cận thứ hai của tôi là thực hiện phân lớp của UIViewController, tạo DialogViewController, và thêm bộ điều khiển xem hộp thoại như một đứa trẻ của lớp con của tôi sử dụng this.AddChildViewController(dv)this.View.AddSubView(dv.View). Trong khi điều này làm việc ban đầu, nếu bạn có bộ điều khiển xem mới trong một UINavigationController, và bạn bấm vào một phần tử ngày, thì khung nhìn ngày xuất hiện dưới dạng một cửa sổ bật lên phương thức thay vì trong hệ thống phân cấp điều khiển điều hướng. (Điều này có ý nghĩa, vì DialogViewController không phải là một phần của phân cấp NavigationController trong thiết kế này).

Từ đó tôi bị kẹt. Tôi không thể tìm thấy bất kỳ ví dụ về việc sử dụng MonoTouch.Dialog như thế này trong các ví dụ. Đây có phải là có thể làm gì? Hoặc nếu nó không phải là, có một lý do tốt là tại sao viết mã như thế này là một ý tưởng tồi?

Trả lời

3

Tôi đã tìm ra cách để làm điều này, mặc dù có vẻ hơi lộn xộn (cảm ơn poupou vì đã cho tôi ý tưởng). Tôi chỉ đặt Root thành null trong lời gọi hàm dựng cơ sở, sau đó đặt nó ngay lập tức theo phương thức contructor:

class NewItemViewController : DialogViewController 
{ 
    private Item _item; 
    public NewItemViewController(bool pushing) : base(null, pushing) 
    { 
     _item = new Item(); 
     BindingContext bc = new BindingContext(this, _item, "Add Item"); 
     this.Root = bc.Root; 
     // more setup 
    } 
    // more methods 
} 

Tôi không biết bạn có thể thay đổi đối tượng Gốc, không chỉ truy cập vào đối tượng gốc.

5

Như bạn không thể chạy bất kỳ mã trước khi gọi các nhà xây dựng cơ sở

Đó không phải là khá chính xác.

Đó không phải là lý tưởng nhưng bạn có thể kế thừa từ DialogViewController và cung cấp nó với một RootElement dụ trống rỗng, như thế này:

public class AddItemViewController : DialogViewController { 
    public AddItemViewController() : base (new RootElement()) { } 
} 

Sau đó bạn có thể thêm những thứ của bạn (hoặc cài đặt mới RootElement) đến Root bất động sản, ví dụ

void Populate() 
{ 
    this.Root.Add (new Section() { ... }); 
} 
+0

Cảm ơn, tôi đã không nghĩ đến việc sử dụng phần tử Gốc theo cách thủ công trong hàm tạo. Tôi đã thực hiện câu trả lời của riêng tôi mà làm việc với các api phản ánh bằng cách thiết lập một phần tử gốc mới trong constructor. –

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