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