2012-06-25 28 views
6

Sử dụng MonoTouch, tôi đang cố tạo chế độ xem tùy chỉnh để tôi có thể sử dụng lại chế độ xem này nhiều lần trong màn hình. (đó là một loạt các nhãn và nút) Sau khi đọc câu trả lời cho bài đăng này: How to add a custom view to a XIB file defined view in monotouch Tôi phải đến gần, nhưng điều này dường như chỉ cho phép tôi thêm chế độ xem tùy chỉnh, được định nghĩa trong myCustomView.CS, nhưng những gì tôi tìm kiếm là một cách để sử dụng một. XIB riêng biệt để thiết kế chế độ xem tùy chỉnh của tôi trong trình tạo giao diện và chỉ sử dụng tệp cs tương ứng để thêm logic. Nếu tôi cố gắng tạo XIB có cùng tên, nội dung sẽ không hiển thị.Tạo chế độ xem tùy chỉnh bằng cách sử dụng xib

bước Tiếp theo:

  • Trong MyCustomView.CS Tôi đã đưa [Register("MyCustomView")].

  • tôi thực hiện các constructor public MyView(IntPtr handle) : base(handle) {}

  • mở ViewController.XIB trong Interface Builder, thêm một UIView và đặt nó là Class để MyCustomView.

Khi tôi chạy mã này, tôi thấy mới được bổ sung UIView, nhưng không phải là yếu tố bên trong xem, tức là nội dung của MyCustomView.XIB

Nếu tôi thêm một cái gì đó vào mã của MyCustomView. CS, giống như this.Backgroundcolor = UIColor.Blue; điều này được hiển thị, nhưng mọi phần tử được thêm vào .XIB thì không. Làm thế nào để tôi nói Monotouch để hiển thị tất cả các công cụ được xác định bên trong MyCustomView.XIB?

Trong các mẫu Objective-C, tôi thấy những thứ như "initWithNib" Thật không may là phần "LoadNib" không được ghi trong Apo Monotouch, nhưng có vẻ như tôi nên làm gì, nhưng ở đâu và ở đâu?

+0

Ông có thể cung cấp mã bạn đang sử dụng thêm chế độ xem xib? Cảm ơn. –

Trả lời

4

Một câu hỏi rất hay, nhưng đó là nhiều hơn về cách XIB hoạt động và những gì chúng tôi có thể làm.

Vấn đề là khi bạn thêm một đối tượng vào XIB và đặt nó thành một lớp tùy chỉnh, bạn chỉ cần hướng dẫn UIKit tạo một thể hiện của đối tượng này. Thực tế bạn thấy trong IB như một cái nhìn, một nút hoặc một điều khiển bất cứ điều gì chỉ là cách IB rút ra nó cho bạn. Bằng cách này, trách nhiệm tạo ra triển vọng sẽ rơi hoàn toàn vào lớp học của bạn.

Trong mục tiêu-C, chúng ta có thể thực hiện một gian lận tốt để có XIB với chế độ xem tùy chỉnh và vẫn thêm chúng vào IB bằng cách đặt tên lớp của chế độ xem được thêm. Điều này là có thể bởi vì bạn có thể trả về bất kỳ cá thể nào từ phương thức -init của lớp của bạn trong Objective-C, điều này là không thể với C#.

Tuy nhiên, bạn vẫn có thể giảm bớt cuộc sống của bạn bằng cách làm như sau:

  1. Hãy xác định XIB là một XIB, trong đó có nội dung giao diện tùy chỉnh của bạn; Vị trí là XIB nơi bạn muốn thêm chế độ xem tùy chỉnh.
  2. Tạo bạn tùy chỉnh xem lớp và một XIB để đặt bên trong của nó
  3. Xử lý phương pháp awakeFromNib để thực sự tải XIB bạn
  4. Sau khi nạp XIB bạn chỉ cần thêm bên trong của nó để dụ bạn như subviews.
  5. Đặt chế độ xem thông thường và đặt lớp học thành chế độ xem của riêng bạn thành Vị trí
  6. Tận hưởng!

Bạn có, tuy nhiên, phải chấp nhận rằng XIB của bạn sẽ chứa một cái nhìn gốc hoặc một cái gì đó, mà sẽ được bổ sung như là một subview vào thể hiện của lớp học của bạn đưa vào Placement.

Bằng cách này, bạn nên có một cái gì đó như:

XIB với nội dung giao diện tùy chỉnh của bạn:

XIB with your custom view contents

Vị trí nơi bạn thêm XIB của bạn:

Placement where you add your XIB

Như ví dụ chế độ xem được thêm vào vị trí của bạn là cùng một số là Chủ sở hữu tệp trong XIB của bạn, bạn có thể đặt các cửa hàng và hành động trong cả hai XIB và Vị trí. Chỉ cần đừng quên bạn xem gốc trong XIB của bạn không phải là trường hợp UIKit sẽ tạo ra để đặt vào vị trí.

Đối với mục đích thuận tiện, xin vui lòng tìm mã của tôi dưới đây mà là lớp cơ sở để giảm bớt việc tạo ra các quan điểm như vậy:

using System; 

using MonoTouch.ObjCRuntime; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 

namespace Member.iOS.Base.Views { 

    /// <summary> 
    /// XibView is a Xib-backed UIView subclass which enables easy customization and custom 
    /// behavior addition. 
    /// </summary> 
    public class XibView : UIView { 

     /// <summary> 
     /// Exception thrown when a loaded XIB doesn't contain any views inside it. 
     /// </summary> 
     class EmptyXibException : Exception { 
     } 

     /// <summary> 
     /// Initializes a new instance of the <see cref="Member.iOS.Base.Views.XibView"/> class. 
     /// </summary> 
     /// <param name='handle'> 
     /// Handle. 
     /// </param> 
     public XibView(IntPtr handle) : base(handle) { 
     } 

     /// <summary> 
     /// Upon loading from a containing XIB, takes care of replacing the current instance (which acts as a stab) with 
     /// a real view loaded from its XIB. 
     /// </summary> 
     public override void AwakeFromNib() { 
      base.AwakeFromNib(); 

      NSArray views = NSBundle.MainBundle.LoadNib(GetType().Name, this, new NSDictionary()); 

      if (views.Count == 0) { 
       throw new EmptyXibException(); 
      } 

      UIView rootView = Runtime.GetNSObject(views.ValueAt(0)) as UIView; 
      rootView.Frame = new System.Drawing.RectangleF(0, 0, Frame.Width, Frame.Height); 
      AddSubview(rootView); 
     } 

    } 
} 
6

Dựa trên kinh nghiệm của tôi trong mã obj-c, tôi sẽ cố gắng đoạn mã sau:

var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1) 
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2) 

(1) cho phép bạn tải các tập tin xib

(2) cho phép bạn chuyển đổi sang chuyển đổi một IntPtr thành kiểu gõ NSObject (phụ).

Khi bạn có myView, bạn có thể thêm nó làm chế độ xem truyền thống. Kiểm tra xem bạn có thiết lập chế độ hiển thị chính xác cho chế độ xem của mình không.

P.S. Nếu bạn cung cấp một số chi tiết khác, chúng tôi có thể giúp bạn. Hơn nữa, kiểm tra mã vì tôi đã viết bằng tay.

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