我正在使用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生成的。
答案 0 :(得分:2)
这很可能是iOS模拟器中的一个错误。有时只是停止检测一些手势。退出模拟器并重新启动它。
UITableViewController应该为你处理滚动表而不需要做任何特别的事情。