2016-07-27 4 views
1

Ich erhalte diese Fehlermeldung, wenn meine app starten:Fehler beim App-Start: Foundation.MonoTouchException: Objective-C-Ausnahme ausgelöst (Xamarin iOS)

Foundation.MonoTouchException: Objective-C-Ausnahme ausgelöst. Name: NSInvalidArgumentException Grund: - [Table initWithCoder:]: Unbekannter Selektor gesendet Instanz 0x796e6fa0 ​​

ich bereits auf Google gesucht, aber nicht finden eine Lösung.

Über die App: Die App hat eine UITableView mit einigen benutzerdefinierten Zellen. Das UITableView befindet sich in einer normalen "Ansicht". Es gibt auch eine Schaltfläche in der normalen "Ansicht", diese Schaltfläche sollte (bei Berührung) eine benutzerdefinierte Zelle zu UITableView hinzufügen.

Das UITableView hat den Namen "tableView" und in den Eigenschaften der Klasse "TableSource". Der Button hat den Namen "btn01" und in Eigenschaften als Klasse "ViewController".

Die benutzerdefinierten Zellen haben als "Wiederverwendungskennung" "Cell01Reuse", "Cell02Reuse" usw. Und als Klasse "Testclass" (die nicht als Datei existiert).

Der View Controller (die Basis, wo alles läuft) hat "ViewController" als Klasse.

Ich habe zwei Klassen mit Code. Zunächst ist „View Controller“:

using System; 
using UIKit; 
using Foundation; 
using System.Collections.Generic; 

namespace myapp 
{ 
    public partial class ViewController : UIViewController 
    { 
     public ViewController(IntPtr handle) : base(handle) 
     { 
     } 

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

      // Perform any additional setup after loading the view, typically from a nib. 

      //UITableView _table; 
      //_table = new UITableView 
      //{ 
      // Frame = new CoreGraphics.CGRect(0, View.Bounds.Height * 0.03, View.Bounds.Width, View.Bounds.Height * 0.80), 
      // Source = new TableSource(null) 
      //}; 
      //_table.SeparatorStyle = UITableViewCellSeparatorStyle.None; 
      //View.AddSubview(_table); 

      TableSource TS = new TableSource(); 

      btn01.TouchUpInside += (sender, e) => 
      { 
       TS.updateTableView(); 
       string cell01 = "Cell01Reuse"; 
       TS.tableItems.Add(cell01); 
      }; 
     } 

     public override void DidReceiveMemoryWarning() 
     { 
      base.DidReceiveMemoryWarning(); 
      // Release any cached data, images, etc that aren't in use. 
     } 
    } 
} 

Zweitens ist „Table“:

using System; 
using System.Collections.Generic; 
using System.Text; 
using Foundation; 
using UIKit; 

namespace myapp 
{ 
    public partial class TableSource : UITableViewSource 
    { 



     //string[] tableItems; 
     public List<string> tableItems = new List<string>(); 
     public static string cellIdentifier = "TableCell"; 

     //public TableSource(string[] items) 
     //{ 
     // tableItems = items; 
     //} 

     public TableSource() 
     { 
     } 

     public override nint RowsInSection(UITableView tableview, nint section) 
     { 
      return 0; 
     } 

     public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath) 
     { 
      UITableViewCell cell = tableView.DequeueReusableCell(cellIdentifier); 
      if (cell == null) 
      { 
       cell = new UITableViewCell(UITableViewCellStyle.Default, cellIdentifier); 
      } 
      cell.TextLabel.Text = tableItems[indexPath.Row]; 
      tableItems.Add(Convert.ToString(cell)); 
      return cell; 
     } 

     public override nint NumberOfSections(UITableView tableView) 
     { 
      return base.NumberOfSections(tableView); 
     } 

     public override void RowSelected(UITableView tableView, NSIndexPath indexPath) 
     { 
      new UIAlertView("Alert", "You touched: " + tableItems[indexPath.Row], null, "OK", null).Show(); 
      tableView.DeselectRow(indexPath, true); 
     } 

     public void updateTableView() 
     { 
      tableView.updateTableView(); 
     } 
    } 
} 

Antwort

1

Eigentlich kann ich das Problem nicht reproduzieren Sie erfüllt, Ihre Beschreibung nicht klar genug ist, aber es gibt ein Problem in Sie Code ist sicher, wie Sie nicht 0 in RowsInSection Methode zurückgeben sollte, ich Ihnen eine Probe Referenz geben kann. (Alle UI von Code erstellt wird)

public partial class ViewController : UIViewController 
{ 
    protected ViewController (IntPtr handle) : base (handle) 
    { 
     // Note: this .ctor should not contain any initialization logic. 
    } 

    public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     // Perform any additional setup after loading the view, typically from a nib. 

     CGRect tableFrame = this.View.Bounds; 
     tableFrame.Y = 100; 
     tableFrame.Height -= 100; 
     UITableView tableView = new UITableView (tableFrame); 
     this.View.AddSubview (tableView); 

     MyTalbeSource mySource = new MyTalbeSource(); 
     tableView.Source = mySource; 
     tableView.ReloadData(); 

     int count = 0; 
     UIButton btnNew = new UIButton (UIButtonType.System); 
     btnNew.Frame = new CGRect (20, 20, 100, 40); 
     btnNew.SetTitle ("NewItem", UIControlState.Normal); 
     btnNew.TouchUpInside += delegate { 
      mySource.AddNewItem ("NewItem" + count++); 
      tableView.ReloadData(); 
     }; 
     this.Add (btnNew); 
    } 
} 

class MyTalbeSource : UITableViewSource 
{ 
    private const string CELL_ID = "MyTalbeCell"; 
    private List<string> dataList; 

    public MyTalbeSource() 
    { 
     dataList = new List<string>(); 
     for (int i = 0; i < 5; i++) { 
      dataList.Add ("Test " + i.ToString()); 
     } 
    } 

    public void AddNewItem (string title) 
    { 
     dataList.Add (title); 
    } 

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

    public override UITableViewCell GetCell (UITableView tableView, Foundation.NSIndexPath indexPath) 
    { 
     MyTableCell cell = tableView.DequeueReusableCell (CELL_ID) as MyTableCell; 
     if (null == cell) { 
      cell = new MyTableCell (UITableViewCellStyle.Default, CELL_ID); 
      cell.InitCell(); 
     } 
     cell.Text = dataList [indexPath.Row]; 
     return cell; 
    } 
} 

class MyTableCell : UITableViewCell 
{ 
    private UILabel lbInfo; 

    public string Text { 
     get { 
      return lbInfo.Text; 
     } 
     set { 
      lbInfo.Text = value; 
     } 
    } 

    public MyTableCell (UITableViewCellStyle style, string cellID) : base (style, cellID) 
    { 
    } 

    public void InitCell() 
    { 
     lbInfo = new UILabel(); 
     lbInfo.TextAlignment = UITextAlignment.Center; 
     this.AddSubview (lbInfo); 
    } 

    public override void LayoutSubviews() 
    { 
     lbInfo.Frame = this.Bounds; 
    } 
} 

Hoffe, dass es Ihnen helfen kann.

Jede Frage zu Xamarin.iOS ist willkommen.

+0

Hilft ein bisschen, aber löst nicht mein Problem. Ich kann meine Situation nicht besser beschreiben als oben. Aber danke! – Reaper

+0

Können Sie Ihre Lösung irgendwo teilen? Oder geben Sie mir mehr Details, um Ihnen zu helfen. Übrigens sollten Sie das UITableView nicht als Eigenschaft in Ihrer UITableSource definieren. –

+0

Danke nochmal für die Antwort. Ich habe es geschafft, einen anderen Weg zu gehen, um meine "Aufgabe" zu lösen. Ich benutzte ein Beispiel von Xamarin und baute es um. Hier ist das Beispiel: https://developer.xamarin.com/recipes/ios/content_controls/tables/custom-tableviewcell/ Ich habe das Problem nicht mehr im Moment. Gibt es eine Möglichkeit, dich irgendwie zu benachrichtigen, wenn ich wieder auf dieses Problem (oder ein ähnliches Problem) stoße? Weil du von Xamarin zu wissen scheinst. Danke nochmal für deine Mühe! ps: Ich habe Ihren Beitrag als Antwort markiert, denn wenn ich immer noch das Problem hätte, hätten Sie mir geholfen, es zu lösen. – Reaper