簡體   English   中英

MONOTOUCH打開一個viewcontroller在tableview單元格上單擊

[英]MONOTOUCH open a viewcontroller on tableview cell is clicked

我有一個帶有表視圖和自定義單元格的以下viewcontroller:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Linq;
using System.Threading;
using System.Data;
using System.IO;
using Mono.Data.Sqlite;
using System.Collections.Generic;
using Zurfers.Mobile.Core;
using AlexTouch.MBProgressHUD;
using System.Collections;

namespace Zurfers.Mobile.iOS
{
    public partial class iPhoneHotelSearchViewController : UIViewController
    {

        MBProgressHUD hud;

        public string Destination {
            get;
            set;
        }

        public DateTime CheckInDate {
            get;
            set;
        }

        public DateTime CheckOutDate {
            get;
            set;
        }

        public int Rooms {
            get;
            set;
        }   

        public iPhoneHotelSearchViewController (IntPtr handle) : base (handle)
        {

        }

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

            hud = new MBProgressHUD(this.View);
            hud.Mode = MBProgressHUDMode.Indeterminate;
            hud.LabelText = "Loading...";
            hud.DetailsLabelText = "Searching Hotel";
            this.View.AddSubview(hud);
            hud.Show(true);

        }

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

        }

        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);


            List<DtoHotelinformation> 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();

        }

        partial void GoBack (MonoTouch.Foundation.NSObject sender)
        {
            DismissViewController(true, null);
        }
    }
}

現在表源

using System;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace Zurfers.Mobile.iOS
{
    public class HotelTableSource : UITableViewSource
    {

        DtoHotelinformation[] tableItems;
        NSString cellIdentifier = new NSString("TableCell");



        public HotelTableSource (DtoHotelinformation[] items)
        {
            tableItems = items;
        }
        public override int RowsInSection (UITableView tableview, int section)
        {
            return tableItems.Length;
        }

        public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
        {
            //WHAT TO DO HERE

            tableView.DeselectRow (indexPath, true); // normal iOS behaviour is to remove the blue highlight
        }

        public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
        {
            CustomCell cell = tableView.DequeueReusableCell(cellIdentifier) as CustomCell;

            if (cell == null)
                cell = new CustomCell(cellIdentifier);
            cell.UpdateCell(tableItems[indexPath.Row].title, tableItems[indexPath.Row].subtitle, tableItems[indexPath.Row].price,
                            tableItems[indexPath.Row].imageUlr, tableItems[indexPath.Row].rating );
            return cell;

        }

        public override float GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
        {
            return 70;
        }
    }
}

最后是customcell代碼:

using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using MonoTouch.Dialog.Utilities;

namespace Zurfers.Mobile.iOS
{
    public class CustomCell : UITableViewCell, IImageUpdated
    {
        UILabel headingLabel, subheadingLabel, priceLabel;
        UIImageView imageService;
        UIImageView star, star2, star3, star4, star5;
        public CustomCell (NSString cellId) : base (UITableViewCellStyle.Default, cellId)
        {
            imageService = new UIImageView();
            star   = new UIImageView();
            star2  = new UIImageView();
            star3  = new UIImageView();
            star4  = new UIImageView();
            star5  = new UIImageView();
            headingLabel = new UILabel(){
                Font = UIFont.FromName("Verdana-Bold", 14f),
                BackgroundColor = UIColor.Clear,
                TextColor = UIColor.FromRGB(241, 241, 211)
            };
            subheadingLabel = new UILabel(){
                Font = UIFont.FromName("Verdana-Bold", 8f),
                TextColor = UIColor.FromRGB(255, 255, 255),
                BackgroundColor = UIColor.Clear
            };
            priceLabel = new UILabel(){
                Font = UIFont.FromName("Verdana", 14f),
                TextColor = UIColor.FromRGB(241, 241, 211),
                BackgroundColor = UIColor.Clear
            };

            AddSubview(imageService);
            AddSubview(headingLabel);
            AddSubview(subheadingLabel);
            AddSubview(priceLabel);
            AddSubview(star);
            AddSubview(star2);
            AddSubview(star3);
            AddSubview(star4);
            AddSubview(star5);

        }

        public void UpdateCell (string title, string subtitle, string price, string imageUlr, string rating )
        {
            if (imageUlr != null) {
                var u = new Uri(imageUlr);
                ImageLoader MyLoader= new ImageLoader(50,50);
                imageService.Image = MyLoader.RequestImage(u,this);

            } else {
                imageService.Image = UIImage.FromFile("generic_no_image_tiny.jpg");
            }


            headingLabel.Text = title;
            subheadingLabel.Text = subtitle;
            if (subtitle.Length > 40) {
                subheadingLabel.LineBreakMode = UILineBreakMode.WordWrap;
                subheadingLabel.Lines = 0;
            }

            switch (rating) {
                case "T":
                    star.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star2.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    break;
                case "S":
                    star.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star2.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star3.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    break;
                case "F":
                    star.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star2.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star3.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star4.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    break;
                case "L":
                    star.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star2.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star3.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star4.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    star5.Image = UIImage.FromFile("ZurfersMovil-Stars.png");
                    break;
            }


            priceLabel.Text = "USD " + price;
            priceLabel.Font = UIFont.BoldSystemFontOfSize (16);
        }


        public void UpdatedImage (Uri uri)
        {
            imageService.Image = ImageLoader.DefaultRequestImage(uri, this);
        }


        public override void LayoutSubviews ()
        {
            base.LayoutSubviews ();
            imageService.Frame = new RectangleF(10, 10, 50, 33);
            headingLabel.Frame = new RectangleF(70, 4, 240, 25);
            subheadingLabel.Frame = new RectangleF(70, 25, 240, 20);
            priceLabel.Frame = new RectangleF(220, 45, 100, 20);
            star.Frame = new RectangleF(70, 45, 15, 15);
            star2.Frame = new RectangleF(85, 45, 15, 15);
            star3.Frame = new RectangleF(100, 45, 15, 15);
            star4.Frame = new RectangleF(115, 45, 15, 15);
            star5.Frame = new RectangleF(130, 45, 15, 15);
        }
    }
}

當用戶觸摸表格視圖的單元格時,我想打開另一個視圖控制器(iPhoneHotelDetailViewController)。 但是我對如何做到這一點一無所知。

請問你能幫幫我嗎。

在此先感謝您的幫助。

通常,您希望NavigationController成為應用程序中的“ top”元素,並包裝所有其他控制器。

在您的AppDelegate中,創建一個NavigationController,並將其設為應用程序的根。

然后創建Search控制器的實例,並將其推送到NavigationController上。

最后,將NavigationController屬性添加到TableSource的構造函數中。

NavigationController nav;

public HotelTableSource (DtoHotelinformation[] items, NavigationController nav)
{
   this.nav = nav;
   tableItems = items;
}

創建TableSource時,請傳入NavigationController引用。之所以可以這樣做,是因為所有ViewController都具有指向其NavigationController的屬性(如果它們包含在其中)。

HotelSearchTable.Source = new HotelTableSource(data.ToArray(), this.NavigationController);

最后,在RowSelected中,創建要顯示的新ViewController的實例:

    public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
    {
        //WHAT TO DO HERE
        MyDetailController myDetail = new MyDetailController();
        nav.PushViewController(myDetail, true);

        tableView.DeselectRow (indexPath, true); // normal iOS behaviour is to remove the blue highlight
    }

我認為到UITableViewSource中的UINavigationController (UI組件)的鏈接UINavigationController 我建議使用基於事件的方法:

  • UITableViewSource聲明事件,並在選擇行時調用它:
public event Action<int> OnRowSelect;
...
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
    tableView.DeselectRow (indexPath, true); // normal iOS behaviour is to remove the blue highlight

    if (OnRowSelect != null) {
        OnRowSelect(indexPath.Row);
    }
}
  • 然后,在UIViewController上處理事件-推送新的UIViewController
var source = data.ToArray();
source.OnRowSelect += HandleOnRowSelect;
HotelSearchTable.Source = new HotelTableSource();
HotelSearchTable.ReloadData();
...
void HandleOnRowSelect(int index)
{
    var data = items[index];

    // Pass data to new view controller and push it
}

避免內存泄漏的提示:當您PopUIViewController或制作新的UITableViewSource實例時,不要忘記退訂OnRowSelect。 即:

  • 在班級成員中聲明source
  • 取消訂閱事件,例如在ViewWillDisappear
source.OnRowSelect -= HandleOnRowSelect;

如果您使用StoryBord,則有一種非常簡單的方法。 然后,您將像這樣在PrepareForSegue方法中傳遞數據。

public override void PrepareForSegue (UIStoryboardSegue segue, NSObject sender)
        {
            base.PrepareForSegue (segue, sender);

            NSIndexPath indexPatch = tableView.IndexPathForSelectedRow;

            if (segue.Identifier.Equals ("showHotelDetail")) {

                    var vc = segue.DestinationViewController as iPhoneHotelDetailViewController;
                    if (vc != null) {

                        //Pass some date to the iPhoneHotelDetailViewController if needed.
                        vc.hotelName = this.tableItems [indexPatch.Row].hotelName;

                    }
            }
        }

在您的StoryBoard中,將customCell與iPhoneHotelDetailViewController連接,然后將segue稱為“ showHotelDetail”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM