Iphone 使用导航控制器从堆栈、选项卡栏释放视图
因此,我正在对appstore上的一个应用程序进行重要更新。我有一个带有标签栏和导航控制器的应用程序。当用户从列表中选择一个项目时,它会将从“我的服务器”发送的xml文件中获取的链接发送到仅为web视图的详细视图控制器。我遇到的问题是,当用户返回到tableview(该选项卡的根视图)时,细节视图不会被释放。在应用程序中选择其他选项时,细节视图不会更改。不是我的数据没有从uishared应用程序数据中发布,而是视图没有发布。我知道这里有很多类似的东西,我都试过了。我会给你我的一些代码,并非常感谢其他提示和技巧。我15岁,刚刚进入开发阶段,所以任何信息都有帮助。这是我认为任何人都需要帮助的代码 TableViewControllerIphone 使用导航控制器从堆栈、选项卡栏释放视图,iphone,uinavigationcontroller,uitabbarcontroller,uitableview,Iphone,Uinavigationcontroller,Uitabbarcontroller,Uitableview,因此,我正在对appstore上的一个应用程序进行重要更新。我有一个带有标签栏和导航控制器的应用程序。当用户从列表中选择一个项目时,它会将从“我的服务器”发送的xml文件中获取的链接发送到仅为web视图的详细视图控制器。我遇到的问题是,当用户返回到tableview(该选项卡的根视图)时,细节视图不会被释放。在应用程序中选择其他选项时,细节视图不会更改。不是我的数据没有从uishared应用程序数据中发布,而是视图没有发布。我知道这里有很多类似的东西,我都试过了。我会给你我的一些代码,并非常感谢
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
int storyIndex = [indexPath indexAtPosition: [indexPath length] - 1];
NSString * storyLink = [[stories objectAtIndex: storyIndex] objectForKey: @"link"];
// clean up the link - get rid of spaces, returns, and tabs...
storyLink = [storyLink stringByReplacingOccurrencesOfString:@" " withString:@""];
storyLink = [storyLink stringByReplacingOccurrencesOfString:@"\n" withString:@""];
storyLink = [storyLink stringByReplacingOccurrencesOfString:@" " withString:@""];
videoDetailViewController.title = @"Videos";
ExampleAppDataObject* theDataObject = [self theAppDataObject];
theDataObject.videoData = storyLink;
if (self.videoDetailViewController == nil)
{
VideoDetailViewController *aBookDetail = [[[VideoDetailViewController alloc] initWithNibName:@"VideosDetailView" bundle:[NSBundle mainBundle]] autorelease];
self.videoDetailViewController = aBookDetail;
[aBookDetail release];
aBookDetail = nil;
}
[self.navigationController pushViewController:videoDetailViewController animated:YES];
}
DetailViewController:
#import "VideoDetailViewController.h"
#import "RSSEntry.h"
#import "ExampleAppDataObject.h"
#import "AppDelegateProtocol.h"
@implementation VideoDetailViewController
@synthesize activityIndicator;
@synthesize webView;
@synthesize pasteboard;
- (ExampleAppDataObject*) theAppDataObject;
{
id<AppDelegateProtocol> theDelegate = (id<AppDelegateProtocol>) [UIApplication sharedApplication].delegate;
ExampleAppDataObject* theDataObject;
theDataObject = (ExampleAppDataObject*) theDelegate.theAppDataObject;
return theDataObject;
}
- (void)viewDidLoad
{
ExampleAppDataObject* theDataObject = [self theAppDataObject];
NSString *urladdress = theDataObject.videoData;
NSURL *url = [NSURL URLWithString:urladdress];
NSURLRequest *requestobj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestobj];
pasteboard = [UIPasteboard generalPasteboard];
[super viewDidLoad];
}
- (void)dealloc
{
[webView release];
webView = nil;
[activityIndicator release];
[pasteboard release];
[VideoDetailViewController release];
[urlData release];
urlData = nil;
[super dealloc];
}
@end
我跳过了很多我觉得不必要的代码。如果你想要实际的文件,请给我发电子邮件到evan。stoddard@me.com不要在detailViewController页面中释放webview,而是将 [webView loadRequest:requestobj];在VIEWDID中显示,而不是VIEWDID加载 此外: 使过渡更平滑的一种方法是更改:
if (self.videoDetailViewController == nil) {
VideoDetailViewController *aBookDetail = [[[VideoDetailViewController alloc] initWithNibName:@"VideosDetailView" bundle:[NSBundle mainBundle]] autorelease];
self.videoDetailViewController = aBookDetail;
[aBookDetail release];
aBookDetail = nil;
}
[self.navigationController pushViewController:videoDetailViewController animated:YES];
应该是:
VideoDetailViewController *aBookDetail = [[VideoDetailViewController alloc] initWithNibName:@"VideosDetailView" bundle:[NSBundle mainBundle]] ;
[self.navigationController pushViewController:videoDetailViewController animated:YES];
[aBookDetail release];
多亏了Anna Billstrom,我意识到我也应该使用ViewDidAspect而不是viewDidLoad。这是因为当从表视图中选择项时,我通过外部数据类将数据传递给控制器。因此,在有数据要从外部数据类加载之前,正在加载局部视图控制器。ViewDidDisplay通过在选定单元格后加载视图并在外部类中有数据后获取数据来解决此问题。当您说不释放时,您如何知道,您使用什么来监视对象?还有,用户看到了什么?在这种情况下,有一个视频,当我返回堆栈的导航部分,选择任何其他tableviewcell并返回detailview时,它仍然是在同一地点暂停的同一视频。啊。媒体播放器。您可能需要在背面执行某些操作,以暂停/释放mediaplayer对象。在仍在运行的对象上接近它,本质上,不是在包含它的容器上。你可能想在这里问一个新问题,并用webview标记它,而不是用控制器标记它。你会得到更具体的答案和专业知识。为什么是webview&而不是MP?让我们在这里写一个更完整的例子:好吧,我试过了,但现在当我选择另一个选项时,它似乎没有重建视图,我在webview中看到的只是一个白痴视图