HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了uitableview – 了解自定义UITableCellView的创建 – 从MonoTouch中的Nib加载大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已多次使用本教程: http://www.alexyork.net/blog/2011/07/18/creating-custom-uitableviewcells-with-monotouch-the-correct-way/

但是其中有一段代码我不太了解:

cell = new MyCustomcatell();
    var views = NSBundle.MainBundle.LoadNib("MyCustomcatell",cell,null);
    cell = Runtime.GetNSObject( views.ValueAt(0) ) as MyCustomcatell;

我试删除它 – 将LoadNib放置在构造函数中 – 但是出口错误导致插件没有正确连接.

任何人都可以了解这里发生的事情吗?为什么我不能只在构造函数中加载这个Nib文件?为什么有必要实际创建两个单元实例?背景中实际发生了什么?代码可以改进吗?

有兴趣了解这一点,因为我经常这样做,我很乐意让这个过程更清洁

斯图尔特

如果有帮助,示例单元格为:https://github.com/slodge/MvvmCrossConference/blob/master/Cirrious.Conference.UI.Touch/Cells/SessionCell2.cs

解决方法

让我们一次看一件事.

LoadNib方法取消归档(并实例化)NIB的内容.第一个参数是NIB的名称,第二个参数是将加载的NIB的所有者.也就是说,NIB的“文件所有者”占位符对象,在这种情况下,我认为它只是一个NSObject.

LoadNib方法还返回NSArray对象.这些对象是NIB的顶级对象,在本例中,它是您在NIB中创建的自定义单元格.

我想当你在构造函数中移动上面的代码时,你实现了这样的事情:

public MyCustomcatell() : base()
{
    NSBundle.MainBundle.LoadNib("MyCustomcatell",this,null);
}

@R_129_7724@,并且您的实现不同但您仍在构造函数中使用LoadNib,则仍无法保留插座.它们是可以创建的,但不会被保留.它不是MonoTouch GC的推出或任何东西,它是自动释放的本机插座.您可能想知道“但为什么我可以在UIViewController的构造函数中使用LoadNib并仍然可以获得我的插座?”.这是正确的,您可以在UIViewController的构造函数中使用LoadNib,但有一个重要的区别:UIViewController是您的File的owner Placeholder对象.如果您尝试对不是文件所有者的控制器执行相同操作,则在保留插座时会出现同样的故障.

您基本上需要从LoadNib方法获得的是顶级对象的返回数组.因此,为了使它在构造函数中工作,“正确”的方式是:

public MyCustomcatell() : base()
    {
        NSArray arr = NSBundle.LoadNib("MyCustomcatell",null);
        this = Runtime.GetNSObject(arr.ValueAt(0)); // should retain everything,//BUT: Compile error!
    }

这与在构造函数之外加载NIB基本相同.但当然,我们不能做“这个=某事”.因此,总结一下LoadNib的创建:您的“MyCustomcatell”是一个顶级对象,它通过LoadNib的返回值提供给我们,而不是通过将其作为所有者传递给我们.

你正确注意到的下一件事是关于这两个例子:我认为这也是错误的.看看上面的代码,并附上一些评论

cell = new MyCustomcatell(); // Created a new instance of MyCustomcatell
 var views = NSBundle.MainBundle.LoadNib("MyCustomcatell",null); // Assigned it as an owner
 cell = Runtime.GetNSObject( views.ValueAt(0) ) as MyCustomcatell; // what happens to the owner?

我认为这是一个内存泄漏.虑以下因素:

// Not needed
//cell = new MyCustomcatell(); 
var views = NSBundle.MainBundle.LoadNib("MyCustomcatell",tableView,null); // owner is Now the tableView
cell = Runtime.GetNSObject( views.ValueAt(0) ) as MyCustomcatell;
views = null; // Don't need it anymore

NIB的所有者现在是表视图.表视图将由运行时处理(在大多数情况下至少).

如果您仍想在MyCustomcatell类中使用LoadNib来创建实例,只需创建一个静态方法

// Inside MyCustomcatell
public static MyCustomcatell CreateCell(NSObject owner)
{
    NSArray topLevelObjects = NSBundle.MainBundle.LoadNib("MyCustomcatell",owner,null);
    MyCustomcatell customcatell = Runtime.GetNSObject(topLevelObjects.ValueAt(0)) as MyCustomcatell;
    topLevelObjects = null;
    return customcatell;
}

有关NIB加载的更多信息:

Can you NIB it?

Apple’s Resource Programming Guide on NIB files

我希望这有帮助.

大佬总结

以上是大佬教程为你收集整理的uitableview – 了解自定义UITableCellView的创建 – 从MonoTouch中的Nib加载全部内容,希望文章能够帮你解决uitableview – 了解自定义UITableCellView的创建 – 从MonoTouch中的Nib加载所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。