0

我正在尝试从苹果开发者计划中完成“你的第二个 iOS 应用程序”教程。它是一个基本的 tableView 应用程序。我的问题是应用程序正在成功构建并且没有警告,但是我无法从主视图中获取详细视图。我已经复制并粘贴了 segue 标识符和苹果提供的代码。segue 正在使用 push,我已将其删除并重试了几次。我正在模拟器中测试应用程序。

  1. 如何判断 segue 是否有效?

  2. 每次我将代码从 Xcode 复制/粘贴到堆栈溢出问题文本区域时,我都会在底部收到警告说代码必须缩进 4 个空格???这是否意味着我必须逐行缩进代码?我做了 control + k 并粘贴在突出显示的区域,但是我仍然收到警告??

  3. 运行模拟器并查看它时,我试图通过单击它来使用披露指示器,我是否必须推动一些特殊的东西,例如 control = click 或 command = click 等?

这是 BirdsMasterViewController.m 文件的代码:

            //
            //  BirdsMasterViewController.m
            //  BirdWatching
            //
            //  Created by David Hall on 11/13/12.
            //  Copyright (c) 2012 David Hall. All rights reserved.
            //

            #import "BirdsMasterViewController.h"

            #import "BirdsDetailViewController.h"

            #import "BirdSightingDataController.h"

            #import "BirdSighting.h"

            /*
            @interface BirdsMasterViewController () {
                NSMutableArray *_objects;
            }
            @end
            */
            @implementation BirdsMasterViewController

            - (void)awakeFromNib
            {
                [super awakeFromNib];

                self.dataController = [[BirdSightingDataController alloc] init];
            }

            - (void)viewDidLoad
            {
                [super viewDidLoad];
                // Do any additional setup after loading the view, typically from a nib.
            /*
                self.navigationItem.leftBarButtonItem = self.editButtonItem;

                UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];
                self.navigationItem.rightBarButtonItem = addButton;
            */
             }

            - (void)viewDidUnload
            {
                [super viewDidUnload];
                // Release any retained subviews of the main view.
            }

            - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
            {
                return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
            }

            /*- (void)insertNewObject:(id)sender
            {
                if (!_objects) {
                    _objects = [[NSMutableArray alloc] init];
                }
                [_objects insertObject:[NSDate date] atIndex:0];
                NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
                [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
            }
            */
            #pragma mark - Table View

            - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
            {
                return 1;
            }

            - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
            {
                return [self.dataController countOfList];
            }

            - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
            {
                static NSString *CellIdentifier = @"BirdSightingCell";

                static NSDateFormatter *formatter = nil;
                if (formatter == nil)
                {
                    formatter = [[NSDateFormatter alloc] init];
                    [formatter setDateStyle:NSDateFormatterMediumStyle];
                }

                UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
                BirdSighting *sightingAtIndex = [self.dataController objectInListAtIndex:indexPath.row];
                [[cell textLabel] setText:sightingAtIndex.name];
                [[cell detailTextLabel] setText:[formatter stringFromDate:(NSDate *)sightingAtIndex.date]];


                return cell;
            }

            - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
            {
                // Return NO if you do not want the specified item to be editable.
                return NO;
            }

            /*- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
            {
                if (editingStyle == UITableViewCellEditingStyleDelete) {
                    [_objects removeObjectAtIndex:indexPath.row];
                    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
                } else if (editingStyle == UITableViewCellEditingStyleInsert) {
                    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
                }
            }
            */
            /*
            // Override to support rearranging the table view.
            - (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
            {
            }
            */

            /*
            // Override to support conditional rearranging of the table view.
            - (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
            {
                // Return NO if you do not want the item to be re-orderable.
                return YES;
            }
            */

            - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
            {
                if ([[segue identifier] isEqualToString:@"ShowSightingDetails"]) {
                    BirdsDetailViewController *detailViewController = [segue destinationViewController];
                    detailViewController.sighting = [self.dataController objectInListAtIndex:[self.tableView indexPathForSelectedRow].row];

                }
            }

            @end

这是 BirdsDetailViewController.m 的代码

        //
        //  BirdSightingDataController.m
        //  BirdWatching
        //
        //  Created by David Hall on 11/25/12.
        //  Copyright (c) 2012 David Hall. All rights reserved.
        //

        #import "BirdSightingDataController.h"
        #import "BirdSighting.h"

        @interface BirdSightingDataController ()

        - (void)initializeDefaultDataList;

        @end

        @implementation BirdSightingDataController

        - (void)initializeDefaultDataList
        {
            NSMutableArray *sightingList = [[NSMutableArray alloc] init];

            self.masterBirdSightingList = sightingList;

            BirdSighting *sighting;

            NSDate *today = [NSDate date];

            sighting = [[BirdSighting alloc] initWithName:@"Pigeon" location:@"Everywhere" date:today];

            [self addBirdSightingWithSighting:sighting];

        }

        - (void)setMasterBirdSightingList:(NSMutableArray *)newList
        {
            if (_masterBirdSightingList != newList)
            {
                _masterBirdSightingList = [newList mutableCopy];
            }

        }

        - (id)init
        {
            if (self = [super init])
            {
                [self initializeDefaultDataList];

                return self;
            }

            return nil;
        }

        - (NSUInteger)countOfList
        {
            return [self.masterBirdSightingList count];
        }

        - (BirdSighting *)objectInListAtIndex:(NSUInteger)theIndex
        {
            return [self.masterBirdSightingList objectAtIndex:theIndex];
        }

        - (void)addBirdSightingWithSighting:(BirdSighting *)sighting
        {
            [self.masterBirdSightingList addObject:sighting];
        }









        @end

大卫霍尔

4

3 回答 3

0
  1. 它在工作时工作。但是如果不知道更多关于你在做什么,很难给你一个答案。

  2. 突出显示文本框中的代码,然后单击此按钮。

    在此处输入图像描述

    它会为您正确缩进代码。

  3. 我无法理解这个问题。

编辑添加

(在看到 OP 邮寄给我的项目副本后)

你的segue没有正确连接。

segue 应该从单元格转到下一个视图控制器,因为关键是在单元格单击时进行转换。您的 segue 从控制器连接到详细视图控制器。在您的项目中 - 右键单击​​您的视图控制器,您将看到 segue 已手动连接。但是右键单击单元格不会显示 segue 连接。

删除当前的 segue 并重新创建它,这次是通过从单元格控制拖动到下一个视图控制器。然后,您可以通过右键单击单元格并确保连接已连接来仔细检查连接。

它应该看起来像:

在此处输入图像描述

于 2012-11-29T14:55:15.267 回答
0
  1. 如果 segue 应该从您的 table 转换到 detail view,并且如果您无法从 table 到达 detail view,那么您的 segue 不起作用。

  2. 您可以使用 SO 编辑器顶部的代码示例按钮,也可以在文本编辑器中选择代码并在复制之前将其缩进。例如,在 Xcode 中很容易选择代码,点击 Command-],然后复制。然后粘贴到 SO 编辑器中。

  3. 请编辑您的问题,使其有意义。但是,我认为您可能会问一些关于如何从您的表中推送视图控制器的问题。如果您使用的是转场,并且您已经在情节提要中创建了转场并且它连接到源视图控制器和目标视图控制器,那么您可以发送-performSegueWithIdentifier:sender:到表的视图控制器。也就是说,您的表视图控制器的-tableView:didSelectRowAtIndexPath:方法应该调用-performSegueWithIdentifier:sender:并指定从表视图控制器到详细视图控制器的 segue 的标识符。无论您是使用模拟器还是在真实设备上运行您的应用程序都没有关系。

于 2012-11-29T15:10:44.057 回答
0

请参阅 Caleb 和 Abizem 关于 1. 和 2 的其他答案。如果我正确理解了您的问题 3,那么答案是否定的。当您想要选择表格行或详细信息披露指示器时,您不必在模拟器中特别按下某些东西。只需单击您也将在设备上点击的那些项目。如果它没有继续,那么很可能不是模拟器导致了问题:)

于 2012-11-29T15:27:01.810 回答