Ios 具有多个变量的PrepareForSegue

Ios 具有多个变量的PrepareForSegue,ios,objective-c,iphone,cocoa-touch,variables,Ios,Objective C,Iphone,Cocoa Touch,Variables,背景:这是我的第二个iphone应用程序,但我做过其他类型的编码 我正在学习本教程以创建iOS音乐播放器应用程序: 进展相当顺利:到目前为止,我可以填充一个包含iPhone播放列表的表格。我可以选择一个播放列表,获取该播放列表的持久ID,并使用该ID在下一页上创建一个查询,该查询将该播放列表中的所有歌曲填充到一个表中,并显示歌曲数和总分钟数 只要只传递一个变量(在本例中为相册名称),教程中的代码就可以工作,这在教程中给出: - (void) prepareForSegue:(UIStorybo

背景:这是我的第二个iphone应用程序,但我做过其他类型的编码

我正在学习本教程以创建iOS音乐播放器应用程序:

进展相当顺利:到目前为止,我可以填充一个包含iPhone播放列表的表格。我可以选择一个播放列表,获取该播放列表的持久ID,并使用该ID在下一页上创建一个查询,该查询将该播放列表中的所有歌曲填充到一个表中,并显示歌曲数和总分钟数

只要只传递一个变量(在本例中为相册名称),教程中的代码就可以工作,这在教程中给出:

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    AlbumViewController *detailViewController = [segue destinationViewController];

    MPMediaQuery *albumsQuery = [MPMediaQuery albumsQuery];
    NSArray *albums = [albumsQuery collections];

    int selectedIndex = [[self.tableView indexPathForSelectedRow] row];
    MPMediaItem *selectedItem = [[albums objectAtIndex:selectedIndex] representativeItem];
    NSString *albumTitle = [selectedItem     valueForProperty:MPMediaItemPropertyAlbumTitle];
//THIS IS WHAT'S PASSING THE VARIABLE                     
    [detailViewController setAlbumTitle:albumTitle];
}
我将其更改为-能够处理播放列表,因为我发现使用持久ID比使用名称更好地制定结果查询(此代码有效):

但是,我希望能够传递两个变量——持久ID和播放列表名称,这样我就可以在目标屏幕的顶部显示它们。你可以在上面的代码中看到,实际获取播放列表名称的那一行被注释掉了——这是因为如果你获取了该值但没有实际使用它,应用程序显然会崩溃。但是如果我知道如何使用它的话,它会让你看到那部分是什么样子。这两个变量都在目标屏幕的ViewController.h中正确声明

我在谷歌上搜索并尝试了各种猜测和组合,但到目前为止没有任何效果。总之,我知道如何发送1个变量,现在如何发送2个

编辑:目标屏幕代码

播放歌曲sviewcontroller.m 一开始是这样的:

#import "PlaylistSongsViewController.h"

@interface PlaylistSongsViewController ()

@end

@implementation PlaylistSongsViewController
@synthesize varPlaylistName;
@synthesize varPlaylistID;
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = varPlaylistName;
}
除我用“播放列表”替换了“唱片集”外,其余部分都可以在“步骤3:显示唱片集歌曲和信息”下找到

playlingsongsviewcontroller.h:

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>

@interface PlaylistSongsViewController : UITableViewController
{
    NSString *varPlaylistName;
    NSString *varPlaylistID;
}
//albumTitle in tutorial

@property NSString *varPlaylistName;
@property NSString *varPlaylistID;

@end
#导入
#进口
@界面播放列表视图控制器:UITableViewController
{
NSString*VARPLAYNAME;
NSString*varplaylid;
}
//教程中的标题
@属性NSString*VARPLAYNAME;
@属性NSString*varplaylid;
@结束

您可以根据需要设置任意数量的变量:

[varLetsSegueOhYeah setVarPlaylistID:varPlaylistID];
[varLetsSegueOhYeah setVarPlaylistName:varPlaylistName];
您还可以直接访问该属性:

varLetsSegueOhYeah.varPlaylistID = varPlaylicstID;
varLetsSegueOhYeah.varPlaylistName = varPlaylistName;
然后在
viewDidLoad
中:

NSLog(@"varPlaylistID = %@",self.varPlaylistID);
NSLog(@"varPlaylistName = %@",self.varPlaylistName);
确保在接口文件中声明属性:

@property (nonatomic , strong) NSString* varPlaylicstID;
@property (nonatomic , strong) NSString* varPlaylistName;
请注意,您不需要像以前那样合成属性,现在可以自动合成属性。

尝试以下操作:

if ([segue.destinationViewController respondsToSelector:@selector(setVarPlaylistID:)]) {

        [segue.destinationViewController setVarPlaylistID:varPlaylistID];
        [segue.destinationViewController setVarPlaylistName:varPlaylistName];
        [segue.destinationViewController setAnotherVariable:variableNameOfCorrectType];

} else NSLog(%@"Segue does not respond to selector");
在destinationViewController中,您必须声明和合成如下内容:

NSString* varPlaylistID;
.
.
.
@synthesize varPlaylistID = _varPlaylistID;

//Declare setter
-(void) setVarPlaylistID:(NSString *)varPlaylistID
{
_varPlaylistID = varPlaylistID;
}

对VarPlayName也这样做。

好的-我终于让它工作了。我发现了我的问题:

  • 我没有意识到我们不是像我习惯于思考的那样“传递全局变量”,而是独立的信息信封。他们是 附加到每个对象类型的更多类似表单字段 发送填写说明
  • 正因为如此,我认为我混乱的思维过程让编译器难以理解
  • 在去掉了“@synthetic”之后,我不知道它什么时候需要在属性名前加“u”,什么时候需要“self”。我分类 通过反复试验和更清晰的 关于概念上发生了什么的想法

  • 我没有意识到我在编译器中设置了断点,这导致它挂起在UI中,否则它就不会挂起。哎呀
  • 新的playliscontroller.h文件:

    #import <UIKit/UIKit.h>
    #import <MediaPlayer/MediaPlayer.h>
    
    @interface PlaylistsViewController : UITableViewController
    
    
    @property (nonatomic, retain) NSString *varSelectedPlaylistID;
    @property (nonatomic, retain) NSString *varSelectedPlaylistName;
    
    
    @end
    

    你能说得很具体吗?我尝试了很多方法,但都没有成功。当你取消注释那一行时,崩溃是什么?我错了,这不是真正的崩溃。用户界面只是挂起。调试区域显示“未使用变量”的黄色警报,并在[varLetsSegueOhYeah setvarplaylaid:varplaylaid]周围显示一条绿线;它似乎不喜欢那样。调试区域发回所有看起来很好的值,但UI不会进入下一个屏幕。好的,我将其添加到了描述中。我在viewDidLoad上面添加了,并尝试重新设置segue变量的格式,就像您在这里看到的那样;不带括号的结果与之前相同;方括号使构建失败。方法和属性需要在接口文件中声明,否则无法编译。只需执行与第一个相同的操作抱歉误解-这两个变量都在playlingsongsviewcontroller.h和playlingsongsviewcontroller.m中声明。我添加到了描述中。谢谢,你能帮我知道在我的代码中应该放在哪里吗?我试着在最后把它放进去,但它不喜欢varLetsSegueOhYeah没有使用。把它放在prepareForSegue的末尾,用它来替换[varLetsSegueOhYeah setvarplaylaid:varplaylaid];我将编辑我的答案,以显示您将在目标视图控制器上使用的选择器。确定已执行此操作,并尝试了不同的操作以清除它不喜欢的未使用变量;结果与之前相同。请逐步完成prepareForSegue,并确保进入if语句。
    #import <UIKit/UIKit.h>
    #import <MediaPlayer/MediaPlayer.h>
    
    @interface PlaylistsViewController : UITableViewController
    
    
    @property (nonatomic, retain) NSString *varSelectedPlaylistID;
    @property (nonatomic, retain) NSString *varSelectedPlaylistName;
    
    
    @end
    
    #import <UIKit/UIKit.h>
    #import <MediaPlayer/MediaPlayer.h>
    
    @interface PlaylistSongsViewController : UITableViewController
    
    @property (nonatomic, retain) NSString *varPlaylistIDToDisplay;
    @property (nonatomic, retain) NSString *varPlaylistNameToDisplay;
    
    @end
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        //First - identify what the user has selected.
    
        //define query
        MPMediaQuery *playlistsQuery = [MPMediaQuery playlistsQuery];
        //dump query results into array
        NSArray *playlists = [playlistsQuery collections];
    
        //identify user selected table row
        int selectedIndex = [[self.tableView indexPathForSelectedRow] row];
        //map user selected table row to array item
        MPMediaItem *selectedItem = [playlists objectAtIndex:selectedIndex];
    
    
        //assign selected values to properties of the object we're looking at right now. They have underscores here for some reason!
        _varSelectedPlaylistID = [selectedItem valueForProperty:MPMediaPlaylistPropertyPersistentID];
        _varSelectedPlaylistName = [selectedItem valueForProperty:MPMediaPlaylistPropertyName];
    
    
        //now let's get ready to go. for an object of type "Playlist Songs View Controller, we want to create a new instance of that and name it MyNewPlaylistInstance and then go to there.
        PlaylistSongsViewController *MyNewPlaylistInstance = [segue destinationViewController];
    
        //when we get to MyNewPlaylistInstance, it will want to know which playlist ID and name to use - tell it to use the values we just set
        MyNewPlaylistInstance.varPlaylistIDToDisplay = self.varSelectedPlaylistID;
        MyNewPlaylistInstance.varPlaylistNameToDisplay = self.varSelectedPlaylistName;
    }
    
        @end