UITableViewCell内容正在消失

时间:2014-03-29 23:35:06

标签: ios uitableview xamarin tableview instagram

我使用Xamarin创建了一个Instagram客户端类型的应用程序。当我最初运行App时它会显示前4或5,当我一直向下滚动时,所有单元格都会消失并显示为null。以下是细胞的出现方式:

TableView.cs

public class TableView : UITableView, ITableCellProvider<Datum>
    {
        public TableView ()
        {
        }

        public TableView (IntPtr handle) : base(handle)
        {
        }

        public UITableViewCell GetCell (Datum item)
        {
            var newCell = this.DequeueReusableCell(InstagramCell.Key) 
                as InstagramCell ?? InstagramCell.Create();

            newCell.Bind (item);

            return newCell;
        }

        public float GetHeightForRow (NSIndexPath indexPath)
        {
            return 340f;
        }

    }

InstagramCell.cs

public partial class InstagramCell : UITableViewCell
{
    private Datum datum;

    public static readonly UINib Nib = UINib.FromName ("InstagramCell", NSBundle.MainBundle);
    public static readonly NSString Key = new NSString ("InstagramCell");

    public InstagramCell (IntPtr handle) : base (handle)
    {
    }

    public static InstagramCell Create()
    {
        return (InstagramCell)Nib.Instantiate (null, null) [0];
    }

    public void Bind(Datum datum)
    {
        this.datum = datum;
        if (this.datum == null || this.datum.caption == null)
        {
            this.TextLabel.Text = "null";
            return;
        }
        else
        {
            this.captionLabel.Text = datum.caption.text;

        }
        Task.Factory.StartNew (async () => {
            this.pictureImage.InvokeOnMainThread (() => this.pictureImage.SetImage (
                url: new NSUrl (datum.images.standard_resolution.url)
                )
            );

            this.profileImage.InvokeOnMainThread (() => this.profileImage.SetImage (
                url: new NSUrl (datum.user.profile_picture)
                )
            );
        });
        this.nameLabel.Text = this.datum.user == null ? "user is null" : datum.user.full_name;
    }
}

我使用SimplyMobile来创建单元格内容。 ITableCellProvider是SimplyMobile的子类。我还在MonoTouch.dialog中使用System.Threading.TasksInstagramCell.cs。在我的MainViewController.xib中,我将TableView.cs类下的TableView对象子类化。抱歉混淆:))

1 个答案:

答案 0 :(得分:0)

TableViews非常特别。它们重用ViewController中定义的单元格(或者您启动TableViewSource的任何位置)。这意味着,如果您使用定义单元格的单个文件,并且具有较长的TableView,您需要向下滚动以查看TableView的其余部分,TableViewSource将调用其基类中的某些方法。细胞内的数据&#39; Textfields或ImageViews或其他任何东西都不会被缓存。相反,大多数情况下,数据将返回其默认值,如可重用单元文件中所定义。有时,它变得更加时髦,您在其中一个顶部单元格中输入的数据会在您滚动时被复制到TableView中的单元格中。一个选项是定义一个缓存,比如List,你可以在其中输入你在TextFields中输入的数据,并使用TableViews主类的方法覆盖你的优势,填充列表,最后,放缓存中的值返回正确的单元格。

我也有很多麻烦,但要努力思考,最终你会得到它!

希望这有帮助。

祝你好运!