带有 uitableview 的基于页面的应用程序;转到下一页时如何显示详细视图并在表格中显示其他数据?

Posted

技术标签:

【中文标题】带有 uitableview 的基于页面的应用程序;转到下一页时如何显示详细视图并在表格中显示其他数据?【英文标题】:page-based app with uitableview; how to show detail view and show another data in the table when goes to next page? 【发布时间】:2012-09-24 11:44:22 【问题描述】:

我有基于页面的应用程序。在每个页面上,我在顶部有 3 个 uibuttons,在右侧有字母表(用于在 uitable 中排序数据的 uibuttons)的 uiscrollview,在中心有 uitableview。如何显示单元格的详细视图?如果有必要添加 uinavigationcontroller 我不能这样做。如果我添加它,它会禁用与我的表格、按钮和滚动视图的交互。 还有一个问题是当进入下一页时如何在tableview和scrollview中显示新数据??

我有 rootViewController 类和 DataViewController 类。 rootViewController 清单:

@interface RootViewController ()
@property (readonly, strong, nonatomic) ModelController *modelController;
@end

@implementation RootViewController

@synthesize pageViewController = _pageViewController;
@synthesize modelController = _modelController;
@synthesize navContr = _navContr;

- (void)viewDidLoad

[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Configure the page view controller and add it as a child view controller.

//[self presentModalViewController:navContr animated:YES];

self.pageViewController = [[[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil] autorelease];
self.pageViewController.delegate = self;

DataViewController *startingViewController = [self.modelController viewControllerAtIndex:0 storyboard:self.storyboard];
NSArray *viewControllers = [NSArray arrayWithObject:startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];

   self.pageViewController.dataSource = self.modelController;

[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];

self.navContr = [[UINavigationController alloc] initWithRootViewController:self.pageViewController];
[self.view addSubview:self.navContr.view];


// Set the page view controller's bounds using an inset rect so that self's view is visible around the edges of the pages.
CGRect pageViewRect = self.view.bounds;
self.pageViewController.view.frame = pageViewRect;

[self.pageViewController didMoveToParentViewController:self];

// Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
for (UIGestureRecognizer *recognizer in self.pageViewController.gestureRecognizers)
    if ([recognizer isKindOfClass:[UITapGestureRecognizer class]])
        [recognizer setEnabled:NO];
    



经过几次操作后,它可以正常工作,但我需要帮助才能使其正常工作!

所以现在看起来像这样

下一个问题:如何去除顶部的棕色空间???


::更新::

问题解决了。只需将 UINavigationController 的 y 轴位置设置为 -20 ;)

【问题讨论】:

【参考方案1】:

我不确定这个关于创建基于导航的项目的链接是否可以帮助你.. (http://iosmadesimple.blogspot.com/2012/08/navigation-based-project-doing-it.html)

在该教程中,有一个名为 SampleViewController 的类,它是 UIViewController 的子类。您可能希望将 tableView 放在 SampleViewController.xib 文件中。然后在您的 SampleViewController.h 文件中,添加一个 IBOutlet UITableView* yourTable 属性并合成它。将它连接到 .xib 文件中的 tableView。 //或者你可以通过编程来实现

在你的 SampleViewController.h 中,让你的界面标题看起来像这样.. 我想你已经知道了......

@interface SampleViewController:UIViewController

在您的 SampleViewcontroller.m 中,在 viewDidLoad 方法下,将表委托和数据源设置为 self:

yourTableView.delegate = self;
yourTableView.datasource = self;

之后,您实现 tableView 委托和数据源方法... //您已经知道这些,因为您已经能够显示 tableview ;)

其中一种方法是“tableview:didSelectAtIndexpath:”-->当您单击其中一个单元格时,您可以在其中放置代码。

假设您有 DetailsViewController 类,这是您希望在单击单元格并显示其详细信息后显示的类。

DetailsViewController 类必须有一个变量来接受您想要显示的数据。比方说,一个 NSString *detailsMessage; //做@property 和@synthesize 的事情...

让我们回到 SampleViewController.m 文件,在 tableview:didSelectAtIndexpath: 下方法: 在那个方法里面..把这些代码。

DetailsViewController *detailsVC = [[DetailsViewController alloc] init];
detailsVC.detailsMessage = @"The Data you want to pass.";
[self.navigationController pushViewController:detailsVC animated:YES];

我希望这会有所帮助。 :(

【讨论】:

谢谢!我知道如何创建 uitable、设置委托和调用方法 didSelectRowAtIndexPath。而且我还知道如何使用 uinavigationcontroller。但是我不知道如何基于pagecontroller将它添加到我的项目中:((( 哎呀我的坏..我很抱歉我帮不上什么忙。 :(【参考方案2】:

可能还有其他方法,但目前最简单的方法是使用导航控制器。事实上,它正是为此而构建的。

如果您不想要导航栏,则可以将其隐藏在 viewWillAppear 函数中。

[self.navigationController setNavigationBarHidden:YES animated:YES];

然后你可以添加另一个 UIViewController 在用户选择单元格时推送。

再次阅读您的 OP,我不确定您是如何添加导航控制器的。

要使用navigationController,您需要创建它并在开始时加载它。然后创建当前的 viewController(带有按钮和表格等的那个)并将其设置为 navigationController 的 rootViewController。

然后显示导航控制器。

您能否解释一下您是如何添加您的 navigationController 的,因为它可能有助于了解出了什么问题。

谢谢

::编辑::

好的,我的假设是正确的。

您使用导航控制器的方式与预期不同。

好的,所以此时您的 AppDelegate 文件将有一个方法 Application didFinishLaunching...

它看起来像这样......

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[OJFViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    return YES;

你应该把它改成这样……

首先向您的 appDelegate 添加一个属性...

@property (nonatomic, strong) UINavigationController *navigationController;

然后把 didFinishLaunchingMethod 改成这个...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[OJFViewController alloc] initWithNibName:@"MainViewController" bundle:nil];

    self.navigationController = [[UINavigationController alloc] initWithRootViewController:self.viewController];

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;

这仍然会显示 MainViewController,但它现在将包含在 navigationController 中。

接下来在您的 MainViewController 函数 viewWillAppearAnimated 添加行...

[self.navigationController setNavigationBarHidden:YES animated:animated];

这将隐藏视图顶部的导航栏,因此您仍然可以访问您的按钮。

您需要一个新的 ViewController 和 xib 文件(例如 DetailViewController)。

当用户选择表格行时,您需要执行类似...

DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

//pass in details of which row was selected.

[self.navigationController pushViewController:detailView animated:YES];

这将显示您的新视图和新视图控制器。您还需要编写一种传入数据的方法(在 DetailViewController 上设置一个属性)。

希望这会有所帮助。

【讨论】:

方法 didFinishLaunchingWithOptions 为空。所有控制器都在 rootVievController.m 中创建。而且我认为我必须更改此类才能获得所需的结果。 好的,在构建设置中,您将有一个类似于主界面的选项。删除该选项中的所有内容并编写 AppDelegate 方法如上。使用 RootViewController 代替 MainViewController。基本上你需要将 RootViewController 设置为 navigationController 的 rootViewController。 如果我这样做,我的功能将会丢失。我不知道如何用翻转来制作页面。并且在构建设置中没有主界面或类似的界面。

以上是关于带有 uitableview 的基于页面的应用程序;转到下一页时如何显示详细视图并在表格中显示其他数据?的主要内容,如果未能解决你的问题,请参考以下文章

带有 UITableView 示例的 MagicalRecord

UITableView - 带有背景图像的 UIRefreshControl

如何在 UITableView 中显示零行的表格

UIScrollview有一个大视图,还是带有多个视图的UITableview?

如何使用多个数据打印带有标题和uitableview的uiwebview

在启用水平页面的 UIScrollview 中滑动多个 UITableView