2017-02-02 63 views
0

我創建了一個的UITableViewCell但設置的UITableView的來源時,我得到一個的NullReferenceExceptionXamarin的iOS UITableView.Source的NullReferenceException

public partial class SessionOverviewViewController : UIViewController 
{ 

    public List<BaseSessionController> Sessions; 

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

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     tvTable.RegisterClassForCellReuse(typeof(SessionTableViewCell), "SessionCell"); 
     SessionTableViewSource source = new SessionTableViewSource(Sessions); 
     tvTable.Source = source; //This line throws the Exception 
    } 
} 

的TableViewSource:

public class SessionTableViewSource : UITableViewSource 
{ 
    List<BaseSessionController> TableItems; 
    string CellIdentifier = "SessionCell"; 

    public SessionTableViewSource(List<BaseSessionController> items) 
    { 
     TableItems = items; 
    } 

    public override nint RowsInSection(UITableView tableview, nint section) 
    { 
     return TableItems.Count; 
    } 

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
    { 
     SessionTableViewCell cell = (SessionTableViewCell)tableView.DequeueReusableCell(CellIdentifier); 
     BaseSessionController friend = TableItems[indexPath.Row]; 

     //---- if there are no cells to reuse, create a new one 
     if (cell == null) 
     { 
      //cell = new SessionTableViewCell(new NSString(CellIdentifier), friend.FriendName, new UIImage(NSData.FromArray(friend.FriendPhoto))); 
      cell = new SessionTableViewCell(new NSString(CellIdentifier), friend); 
     } 

     //cell.UpdateCellData(friend.UserName, new UIImage(NSData.FromArray(friend.FriendPhoto))); 

     return cell; 
    } 
} 

,細胞本身

public partial class SessionTableViewCell : UITableViewCell 
{ 
    public BaseSessionController Session; 

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

    public SessionTableViewCell(NSString cellId, BaseSessionController session) : base(UITableViewCellStyle.Default, cellId) 
    { 
     Session = session; 
     lblDate.Text = Session.Model.SessionStartTime.ToString("d"); 
    } 
} 

希望有人可以看到我所犯的錯誤,並能幫助我。

在此先感謝

+0

你可以調試並檢查GetCell或RowsInSection是否得到執行?或「源」不是null? – Darshana

+0

btw,故事板或xib中是否有標識符爲「SessionCell」的單元格?我認爲這個問題 – Darshana

+0

這兩種方法都沒有得到執行,我檢查'source'。它絕對不是null,UITableView出口也不爲空等。是的,我在Storyboard中設置標識符 –

回答

1

審查故事板,它後被發現電視表實際上是一個滾動視圖。 令人沮喪的無用的錯誤消息:)

+0

極度無用,但非常感謝您的幫助! –

0

要註冊電池的UITableView

tvTable.RegisterClassForCellReuse(typeof(SessionTableViewCell), "SessionCell"); 

更改代碼

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
{ 
    SessionTableViewCell cell = (SessionTableViewCell)tableView.DequeueReusableCell(CellIdentifier); 
    BaseSessionController friend = TableItems[indexPath.Row]; 


    cell.Session = friend; 

    return cell; 
} 

public partial class SessionTableViewCell : UITableViewCell 
{ 
    private BaseSessionController _session; 
    public BaseSessionController Session 
    { 
     get { return _session; } 
     set 
     { 
      _session = value; 
      if(value != null) 
      { 
       lblDate.Text = value.Model.SessionStartTime.ToString("d"); 
      } 
     } 
    } 

    public SessionTableViewCell (IntPtr handle) : base (handle) 
    { 
    } 
} 
+0

'cell = new SessionTableViewCell();'會產生一些問題,因爲我需要提供一個'IntPtr'變量 –

+0

對不起,你應該刪除'if(cell = null)'看到我的回答更新 – sunyt

+0

好吧,但是我仍然在同一行得到同樣的錯誤 –

0

你可以試試這個:

ViewDidLoad

public override void ViewDidLoad() 
{  
    base.ViewDidLoad(); 
    SessionTableViewSource source = new SessionTableViewSource(Sessions); 
    tvTable.Source = source; 
} 

在你TableViewSource - >GetCell把這個:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
{ 
    BaseSessionController friend = TableItems[indexPath.Row]; 
    var cell = tableView.DequeueReusableCell ("SessionCell") as SessionTableViewCell; 
    cell.Update(friend); 
    return cell; 
} 

而在你SessionTableViewCell把這個:

public void UpdateCell(BaseSessionController friend) 
{ 
    Session = session; 
    lblDate.Text = Session.Model.SessionStartTime.ToString("d"); 
} 
+0

它仍然崩潰與NullReferenceException:/ –

+0

@Daniel嘗試更改'GetCell'只返回'新的UITableViewCell();'和看看會發生什麼 – angak

+0

這只是拋出同樣的異常,因爲GetCell之前沒有'tvTable.Source =源調用;' –