Xamarin UITableView不会滚动

时间:2014-09-30 17:38:22

标签: ios uitableview xamarin.ios xamarin xamarin-studio

我正在使用Xamarin开发一个小型测试iOS应用程序,该应用程序显示填充了推文的TableView。我有一个简化版帐户,所以我避免使用组件,因为这会增加我的二进制文件的大小。

我有一个TableViewController,并在UITableView中填充了足够的数据来生成滚动,但它不会滚动。

我在Storyboard上将Scroll Enabled设置为true,而我的TableSource类有一个List,用于保存要显示的数据。 UITableView中的每个单元格(我正在使用的单元格样式是UITableViewCellStyle.Value1)显示推文文本,发布者,创建日期和用户图像。

我的TableSource类的结构如下:

public class TableSource : UITableViewSource
{
    List<Tweet> tableItems;
    public static string cellIdentifier = "TableCell";
    public Dictionary<string, UIImage> photoCache;

    public TableSource (List<Tweet> items)
    {
        tableItems = items;
        photoCache = new Dictionary<string, UIImage> ();
    }

    public override int RowsInSection(UITableView tableview, int section){
        return tableItems.Count;
    }

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

        if (cell != null) {
            cell = new UITableViewCell (UITableViewCellStyle.Value1, cellIdentifier);

        }

        var index = indexPath.Row;

        var tweet = tableItems [index];

        cell.TextLabel.Text = tweet.TweetText;
        cell.DetailTextLabel.Text = "by " + tweet.UserName + " at " + tweet.CreatedAt.ToShortDateString();

        if (!photoCache.ContainsKey(tweet.UserImage)) {
            using (var imgUrl = new NSUrl (tweet.UserImage)) {
                using (var data = NSData.FromUrl (imgUrl)) {
                    var img = UIImage.LoadFromData (data);
                    cell.ImageView.Image = img;
                    photoCache.Add (tweet.UserImage, img);
                }
            }
        } else {
            cell.ImageView.Image = photoCache [tweet.UserImage];
        }
        return cell;
    }
}

正如您所看到的,我有一个包含Tweet对象的List(一条推文包含文本,用户名,一个DateTime对象和用户图像网址),我还有一个词典来保存用户下载的照片。创建单元格没有任何问题,看起来应该如此。

但是UITableView不会滚动。

解析推文并创建UITableView源的方法是:

    private void ReadStreamFromTwitterMentionsResponse(WebResponse response){
        using (Stream responseStream = response.GetResponseStream ()) {
            using (StreamReader sr = new StreamReader (responseStream)) {
                // read response and parse it
                string content = sr.ReadToEnd ();
                var json = JsonObject.Parse (content);
                var statuses = json ["statuses"];
                // for each status create a Tweet object and put it in a List
                foreach (JsonObject status in statuses) {
                    try{
                        var user_name = status ["user"] ["name"];
                        var user_image = status ["user"] ["profile_image_url"];
                        var tweet_text = status ["text"];
                        var tweet_date = status ["created_at"];
                        Console.WriteLine("tweet_date " + tweet_date);
                        DateTime tweet_date_obj = DateTime.ParseExact (tweet_date, "ddd MMM dd HH:mm:ss zzzz yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);

                        tweets.Add(new Tweet(tweet_text, user_name, user_image, tweet_date_obj));
                    }catch(Exception ex){
                        Console.WriteLine ("Error " + ex.Message);
                    }
                }
                // After finishing filling the List with tweets, tell main thread to
                // make a TableSource instance and pass the tweets list and to reload its data
                InvokeOnMainThread (delegate {
                    TableView.Source = new TableSource (tweets);
                    TableView.ReloadData();
                // The following line returns a Rectangle which height value is greater than the device's height
                Console.WriteLine("content size " + TableView.ContentSize);
                });
            }
        }
    }

我在CollectionViews上遇到了类似的问题,控件内的内容足以引发滚动,但不会触发滚动。

我错过了什么吗?为什么不滚动内容?

编辑1

为了确保UITableView确实有超出可见帧的单元格,我调用了ScrollRectToVisible方法,并且UITableView滚动到指定区域,以编程方式我可以滚动但UITableView忽略了用户触摸手势。

我是否必须指定触控手势才能启用滚动功能?当我点击一行时它会被选中,那么为什么只有滚动没有响应呢?

编辑2

我忘了澄清一些事情,UITableView是通过带有TableViewController的Storyboard生成的。

1 个答案:

答案 0 :(得分:2)

这很可能是iOS模拟器中的一个错误。有时只是停止检测一些手势。退出模拟器并重新启动它。

UITableViewController应该为你处理滚动表而不需要做任何特别的事情。