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:
- 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.
- Tạo bạn tùy chỉnh xem lớp và một XIB để đặt bên trong của nó
- Xử lý phương pháp awakeFromNib để thực sự tải XIB bạn
- Sau khi nạp XIB bạn chỉ cần thêm bên trong của nó để dụ bạn như subviews.
- Đặ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í
- 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](https://i.stack.imgur.com/GHPVo.png)
Vị trí nơi bạn thêm XIB của bạn:
![Placement where you add your XIB](https://i.stack.imgur.com/5Gf3a.png)
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);
}
}
}
Ông có thể cung cấp mã bạn đang sử dụng thêm chế độ xem xib? Cảm ơn. –