MONOTOUCH选择了行项目

时间:2013-08-05 16:08:11

标签: uiviewcontroller uinavigationcontroller xamarin.ios

我有一个导航控制器在桌子上显示一个列表o项目,然后我需要触摸一个项目,显示该项目的详细信息。

这是我填写表格的代码:

public void SearchHotel (){

    Hotel hotel = new Hotel();
    var distribution = new HotelDistribution[]{new HotelDistribution(){ Adults = 1, Children = 0, ChildrenAges = new int[0]} };
    var items = hotel.SearchHotels(Convert.ToDateTime("2013-08-08"),Convert.ToDateTime("2013-09-09 "),"(MIA)", distribution,"","","",0);


    data = new List<DtoHotelinformation>();

    foreach (var item in items)
    {
        DtoHotelinformation DtoHotelinformation = new DtoHotelinformation();
        DtoHotelinformation.code  = item.Code.ToString();
        DtoHotelinformation.price  = item.Price.ToString();
        DtoHotelinformation.title =  item.Name.ToString().ToTitleCase();
        DtoHotelinformation.subtitle = item.Address.ToString();
        DtoHotelinformation.rating  = item.Rating.ToString();
        DtoHotelinformation.imageUlr = item.ImageUrl;

        data.Add(DtoHotelinformation);
    }

    hud.Hide(true);
    hud.RemoveFromSuperview();
    HotelSearchTable.Source = new HotelTableSource(data.ToArray());
    HotelSearchTable.ReloadData();

}

因为我正在使用storyboard来显示详细信息视图控制器,所以在我的表源代码中有这个代码:

public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{

    if (RowTouched != null) {
        RowTouched (this, EventArgs.Empty);
    }
    tableView.DeselectRow (indexPath, true); // normal iOS behaviour is to remove the blue highlight
}

回到我的viewcontroller我调用RowTouched来显示这样的细节控制器:

public override void ViewDidAppear (bool animated) {
    base.ViewDidAppear (animated);
    SearchHotel ();

    var source = new HotelTableSource(data.ToArray());
    var detail = Storyboard.InstantiateViewController("HotelDetailScreen") as  iPhoneHotelDetailViewController;
    source.RowTouched += (sender, e) => {
        this.NavigationController.PushViewController(detail, true);

    };
    HotelSearchTable.Source = source;

}

但我需要传递表格上的项目信息以显示详细信息。我真的不知道该怎么办?

注意:我不能使用PrepareForSegue,因为我在控制器之间没有segue。

提前致谢

2 个答案:

答案 0 :(得分:0)

如果您愿意,可以暂停UINavigationController 从您的行选定事件中,在表数据源内。

从那里你可以推送你的新ViewController。

“Row_Selected”中的 [indexPath.Row]应该告诉您用户选择的数组或列表中的哪个元素。

UINavigationController navcontroller =(UINavigationController)UIApplication.SharedApplication.Windows[0].RootViewController;

答案 1 :(得分:0)

将数据传递给事件处理程序很简单,就是EventArgs参数的用途。

创建一个继承自EventArgs的类,并具有所需数据的属性:

public class HotelSelectedEventARgs : EventArgs
{
  public DTOHotelInformation HotelInfo { get; set; }
}

然后,当您在RowSelected中调用处理程序时,不是传递空的EventArgs,而是创建自定义类的实例并将所选数据分配给HotelInfo属性。