在Xamarin.iOS中使用不同的单元格样式

时间:2015-04-27 13:18:05

标签: c# ios uitableview xamarin xamarin.ios

我想创建一个简单的示例,我想使用另一个UITableViewCellStyle。在我的示例中,它是UITableViewCellStyleValue1。我在故事板中添加了UITableViewController,将类名设置为 NakedTableViewController ,从而使用动态原型作为内容,然后我设置表视图单元格样式右侧详细信息,我还将单元格标识符设置为 MyCellId

这是我使用的代码:

NakedTableViewController

partial class NakedTableViewController : UITableViewController
{

    public NakedTableViewController (IntPtr handle) : base (handle)
    {
        TableView.RegisterClassForCellReuse (typeof(UITableViewCell), NakedTableViewSource.MyCellId);
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();


        TableView.Source = new NakedTableViewSource ();
    }
}

NakedTableViewSource

public class NakedTableViewSource : UITableViewSource
{
    public static readonly NSString MyCellId = new NSString ("MyCellId");

    public NakedTableViewSource ()
    {
    }

    public override nint NumberOfSections (UITableView tableView)
    {
        // TODO: return the actual number of sections
        return 1;
    }

    public override nint RowsInSection (UITableView tableview, nint section)
    {
        // TODO: return the actual number of items in the section
        return 1;
    }

    public override string TitleForHeader (UITableView tableView, nint section)
    {
        return "Header";
    }

    public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell (MyCellId) as UITableViewCell;
        //          if (cell == null)
        //              cell = new UITableViewCell ();

        // TODO: populate the cell with the appropriate data based on the indexPath
        cell.TextLabel.Text = "TextLabel";
        cell.DetailTextLabel.Text = "DetailTextLabel";

        return cell;
    }

正如您所看到的,我正在使用更新的细胞再利用模式。

当我尝试设置DetailTextLabel

时,应用程序崩溃了
  

对象引用未设置为对象的实例

因此,似乎样式UITableViewCellStyleValue1未正确注册,并且详细信息标签的设置失败。我做错了什么?

修改

堆栈跟踪:

  at TestNakedTableView.NakedTableViewSource.GetCell (UIKit.UITableView tableView, Foundation.NSIndexPath indexPath) [0x00028] in /Users/some-user/Projects/TestNakedTableView/TestNakedTableView/NakedTableViewSource.cs:47 
  at (wrapper managed-to-native) UIKit.UIApplication:UIApplicationMain (int,string[],intptr,intptr)
  at UIKit.UIApplication.Main (System.String[] args, IntPtr principal, IntPtr delegate) [0x00005] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:62 
  at UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00038] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:46 
  at TestNakedTableView.Application.Main (System.String[] args) [0x00008] in /Users/some-user/Projects/TestNakedTableView/TestNakedTableView/Main.cs:17 

1 个答案:

答案 0 :(得分:2)

更新答案:

解决方案:

[Export("initWithStyle:reuseIdentifier:")]
public MyCustomCell(UITableViewCellStyle style, NSString cellIdentifier)
        : base(SomeConstantValue, UITableViewCellStyle.Value1, cellIdentifier)
{

}

来源:https://forums.xamarin.com/discussion/comment/54047/#Comment_54047

上一个答案:

我认为你只是错过了初始化

if (cell == null) {
    cell = new UITableViewCell (UITableViewCellStyle.Value1, MyCellId);
}

所以完整的代码是:

 public override UITableViewCell GetCell (UITableView tableView, NSIndexPath indexPath)
    {
        UITableViewCell cell = tableView.DequeueReusableCell (MyCellId) as UITableViewCell;

        if (cell == null) {
             cell = new UITableViewCell (UITableViewCellStyle.Value1, MyCellId);
        }

        cell.TextLabel.Text = "TextLabel";
        cell.DetailTextLabel.Text = "DetailTextLabel";

        return cell;
    }

[1] http://developer.xamarin.com/recipes/ios/content_controls/tables/specify_the_cell_type/