下面是我用来获取和解析Feed的不同页面的函数.
- (void)getFeed:(NSInteger) pageNumber
{
collectedData = [[NSMutableData alloc] init];
NSString *urlStr =[NSString stringWithFormat:@"http://sitename.com/feed/?paged=%d", pageNumber];
NSURL *url = [NSURL URLWithString:urlStr];
NSURLRequest *req = [NSURLRequest requestWithURL:url];
conn = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
}
Run Code Online (Sandbox Code Playgroud)
当用户向下滚动到tableview的底部时,我使用以下函数来访问feed的第二页,依此类推,递增计数器:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
float endScrolling = scrollView.contentOffset.y + scrollView.frame.size.height;
if (endScrolling >= scrollView.contentSize.height)
{
counter ++;
[self getFeed:counter];
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,当它不是在已经获取的项目下面加载它时,它会重新加载tableview以显示新的页面项目,而旧的页面项目将消失.我想在现有页面下面加载新的页面项目以进行无限滚动.我怎样才能做到这一点?
我必须在里面添加UIWebView一些按钮和标签UIScrollView.我已经看到很多关于如何添加UIWebView内部的问题UIScrollView但不幸的是他们无法帮助我完成我的任务.所以请不要将其标记为重复或其他内容.
从理论上讲,这个问题可以通过以下步骤解决:
1)制作UIWebView子视图UIScrollView.
2)调用setScrollEnabled:NO了UIWebView禁用其本土滚动.
3)设置内容的大小UIScrollView和UIWebView内部加载的HTML字符串的大小UIWebview.
我正在使用iOS 6和StoryBoards.我添加了UIWebView作为子视图UIScrollView.
然后在我webViewDidFinishLoad,我使用了以下内容:
NSString *webHeight = [webView stringByEvaluatingJavaScriptFromString:@"document.height;"];
NSLog(@"WebView Height %@", webHeight);
Run Code Online (Sandbox Code Playgroud)
这给了我WebView的高度.
在StackOverFlow上,我遇到了以下内容.
CGRect frame = webView.frame;
frame.size.height = 1;
webView.frame = frame;
CGSize fittingSize = [webView sizeThatFits:CGSizeZero];
frame.size = fittingSize;
webView.frame = frame;
NSLog(@"size: %f, %f", fittingSize.width, fittingSize.height);
Run Code Online (Sandbox Code Playgroud)
然后我已将大小设置UISCrollView为大小UIWebView:
mainScrollView.contentSize = …Run Code Online (Sandbox Code Playgroud) 我有一个简单的iPad应用程序,MasterviewController有一个tableview和一个包含UIWebView的DetailViewController.然后我在我的Storyboard中拖放了一个SplitViewController,将它与我的Master和Detail控制器连接起来.在MasterViewController中我使用以下内容:
- (void) awakeFromNib
{
self.splitViewController.delegate = self;
}
- (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation
{
return NO;
}
Run Code Online (Sandbox Code Playgroud)
目前看起来如下:

一切都很好.我想要做的是使用DetailViewController左上角的按钮隐藏和取消隐藏MasterViewController,就像iPad Mail应用程序一样.
我发现了一些与此问题相关的问题,但他们并没有像我一样只是在Storyboard中拖动它并编写几行代码来创建SplitView,所以不要将它标记为重复或类似的东西.
注意:请不要建议使用MGSplitViewController或任何其他第三方库.提前致谢.
MasterViewController嵌入在导航控制器中.虽然DetailViewController上面有一个手动添加的顶栏,因为当在SplitView中添加全部内容时,它会丢失顶部的导航栏.我所知道的是,我可以在DetailView的顶部栏上创建一个IBAction按钮,但不知道如何触发隐藏和取消隐藏功能.
我在项目中面临一个小问题.我有一个简单的IPad应用程序,在Lanscape方向使用SplitView.MasterViewController是一个tableview,而DetailView是WebView,如下所示:

上图导致以下结果:

之后,我把整个东西放在ECSlidingViewController里面.点击MasterViewController中的"菜单"按钮将显示侧面菜单,如下所示:

现在我可以点击菜单中的其他选项,让我们说我已经在菜单中点击了"联系人",关联的视图控制器将出现如下所示:(此视图控制器没有任何详细视图)

到目前为止一切都很好,正是我想要的!现在,当我再次点击"菜单"按钮以显示菜单并再次选择"导航"以显示桌面视图时,问题就开始了.点击"导航"时,它会显示MasterView,但会隐藏DetailView,如下所示:

除此之外,点击上面tableivew中的任何条目将导致程序崩溃,并在控制台中显示以下消息:
*在声明失败- [UIStoryboardReplaceSegue执行],2013年3月30日/SourceCache/UIKit_Sim/UIKit-2380.17/UIStoryboardBuiltInSegues.m:63 13:59:58.179 19IPadIPad [5806:C07]*终止应用程序由于未捕获的异常'NSInternalInconsistencyException' ,原因:"找不到一个拆分视图控制器祖先'’,在执行分割视图控制器替换赛格瑞(标识符'pushLink’)与目的地'’"***第一掷调用堆栈:(0x217b012 0x16bce7e 0x217ae78 0x1152665 0xa57349 0xa48b99 0xa48c14 0x6b0249 0x6b04ed 0x10ba5b3 0x213a376 0x2139e06 0x2121a82 0x2120f44 0x2120e1b 0x1d587e3 0x1d58668 0x600ffc 0x24bd 0x23e5)的libc ++ abi.dylib:终止叫做抛出一个异常
有人可以调查问题并告诉问题可能在哪里.提前致谢.
在聊天时与用户交谈后,我点击菜单中的导航后,出现的下一件事只是主视图和实际上没有加载splitview.看起来这是问题,但我不知道如何解决这个问题.
ECSlidingView如何与SplitView集成
在收到评论询问ECSlidingView如何连接到项目和SplitView后,我正在更新问题.
我创建了一个名为'MainSplitViewController'的类,它继承自UISplitViewController,并在身份检查器的故事板中将它与splitView连接起来.我也给它了"SplitTop"的故事板ID.
然后在我的InitialViewController中,我将SplitView称为topviewcontroller,如下所示:
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
self.topViewController = [storyboard instantiateViewControllerWithIdentifier:@"SplitTop"];
}
Run Code Online (Sandbox Code Playgroud)
当您在MasterViewController上按下"Menu"按钮时,会出现ECSlidingView菜单,如上图所示.该菜单按钮使用IBAction来显示ECSlidingView:
- (IBAction)revealMenu:(id)sender {
[self.slidingViewController anchorTopViewTo:ECRight];
}
Run Code Online (Sandbox Code Playgroud) 我正在使用提要阅读器,我正在通过使用nsxmlparser解析rss提要来完成它.我还有从CDATA块中获取的缩略图对象.
-(void)parser:(NSXMLParser *)parser foundCDATA:(NSData *)CDATABlock
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
NSString *storyImageURL = [self getFirstImageUrl:someString];
NSURL *tempURL = [NSURL URLWithString:storyImageURL];
NSData *tempData = [NSData dataWithContentsOfURL:tempURL];
thumbnail = [UIImage imageWithData:tempData];
});
}
Run Code Online (Sandbox Code Playgroud)
我使用归档和编码和解码方法来保存图像和其他tableview对象.
问题是,当我按原样使用上面的代码时,它不会保留图像,而其他tableview对象(如标题和发布日期)仍然存在.但是当我使用上面没有dispatch_async的代码时,它开始持久化图像但锁定用户界面.
如何在不锁定用户界面的情况下保留图像?
请不要回答一些库存储和缓存图像或Apple的延迟加载示例.谢谢
更新:
根据提供的答案以及斯坦福在iTunes中关于多线程的讲座后,我已经实现了以下代码:
NSString *someString = [[NSString alloc] initWithData:CDATABlock encoding:NSUTF8StringEncoding];
NSString *storyImageURL = [self getFirstImageUrl:someString];
NSURL *tempURL = [NSURL URLWithString:storyImageURL];
dispatch_queue_t downloadQueue = dispatch_queue_create("image downloader", NULL);
dispatch_async(downloadQueue, ^{
NSData *tempData = [NSData dataWithContentsOfURL:tempURL];
dispatch_async(dispatch_get_main_queue(), ^{
thumbnail = [UIImage imageWithData:tempData];
}); …Run Code Online (Sandbox Code Playgroud) 我有一个简单的iOS应用程序项目,我一直在努力.tableview显示从Web服务(rss feed)获取的条目,并点击其中一个segue到Web视图.
使用以下内容,我正在检查项目是否已被读取,如果是,则使用setAccessoryType设置复选标记以指示该项目已被读取:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ItemFeed *entry = [[channel items] objectAtIndex:[indexPath row]];
[[MyFeedStore sharedStore] markItemAsRead:entry];
[[[self tableView] cellForRowAtIndexPath:indexPath] setAccessoryType:UITableViewCellAccessoryCheckmark];
}
Run Code Online (Sandbox Code Playgroud)
上面的代码导致以下结果:

我想要的是细胞被模糊以表明它已被阅读.我将来自TechCrunch iPhone应用程序的以下图像作为我想要的示例:

提前致谢.
更新: 我尝试更改didSelectRowAtIndexPath中的文本颜色,但它不起作用:
ItemsViewCell *cell = (ItemsViewCell *)[tableView dequeueReusableCellWithIdentifier:@"ItemsCell"];
cell.titleLabel.textColor = [UIColor redColor]; //Red color is just for checking right now
Run Code Online (Sandbox Code Playgroud) 我在与此主题相关的stackoverflow上看到了不同的问题.有人说不NSCoding符合,UIImage其他人说用iOS 5,它确实符合.
我想在我的应用程序中保留图像.我正在使用encode和decode方法和一切(标题,标签等)是持久的,但不是图像.
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:title forKey:@"title"];
[aCoder encodeObject:link forKey:@"link"];
[aCoder encodeObject:creator forKey:@"creator"];
[aCoder encodeObject:pubDate forKey:@"pubDate"];
// [aCoder encodeObject:thumbnail forKey:@"thumbnail"];
[aCoder encodeObject:UIImagePNGRepresentation(thumbnail) forKey:@"thumbnail"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self)
{
[self setTitle:[aDecoder decodeObjectForKey:@"title"]];
[self setLink:[aDecoder decodeObjectForKey:@"link"]];
[self setCreator:[aDecoder decodeObjectForKey:@"creator"]];
[self setPubDate:[aDecoder decodeObjectForKey:@"pubDate"]];
[self setThumbnail:[aDecoder decodeObjectForKey:@"thumbnail"]];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我也在使用UIPNGRepresentation但不起作用.有人可以帮我弄这个吗.
谢谢.
ios ×7
xcode ×5
iphone ×3
objective-c ×3
ipad ×2
uiimageview ×2
uiscrollview ×2
uitableview ×2
uiimage ×1
uiwebview ×1