prespare For Segue 전달 방법: 객체
지도 뷰에 많은 주석이 있습니다.rightCalloutAccessory버튼)을 수 있습니다).버튼은 여기서부터 segue를 실행합니다.mapview에 대해서tableview합격하고 싶다.tableview어떤 콜아웃버튼을 클릭했는지에 따라 다른 오브젝트(데이터를 보관 유지)가 표시됩니다.
예: (완전 구성)
- annotation1 (Austin) -> 데이터 obj 1 (Austin 관련)
- 주석 2(댈러스) -> 데이터 obj 2 전달(댈러스 관련)
- 주석 3(Houston) -> 데이터 obj 3 등을 전달합니다.(알고 계셨군요)
어떤 호출 버튼을 클릭했는지 알 수 있습니다.
사용하고 있다prepareForSegue: 데이터 obj를 수신처에 전달합니다.ViewController필요한 데이터 obj에 대해 이 콜에 추가 인수를 적용할 수 없기 때문에 같은 효과를 얻기 위한 우아한 방법(동적 데이터 obj)은 무엇입니까?
어떤 팁이라도 주시면 감사하겠습니다.
에서 타겟 뷰 컨트롤러에 대한 참조만 하면 됩니다.prepareForSegue:메서드를 사용하여 필요한 객체를 전달합니다.여기 예가 있습니다.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"YOUR_SEGUE_NAME_HERE"])
{
// Get reference to the destination view controller
YourViewController *vc = [segue destinationViewController];
// Pass any objects to the view controller here, like...
[vc setMyObjectHere:object];
}
}
REVIESION: 를 사용할 수도 있습니다.performSegueWithIdentifier:sender:선택 또는 버튼 누름에 따라 새 보기로의 전환을 활성화하는 방법.
예를 들어 뷰 컨트롤러가 두 개 있다고 가정해 보겠습니다.첫 번째 버튼에는 3개의 버튼이 있으며, 두 번째 버튼에는 전환 전에 어떤 버튼을 눌렀는지 알아야 합니다.버튼을 케이블로 연결하여IBAction를 사용하는 코드로performSegueWithIdentifier:방법, 이렇게...
// When any of my buttons are pressed, push the next view
- (IBAction)buttonPressed:(id)sender
{
[self performSegueWithIdentifier:@"MySegue" sender:sender];
}
// This will get called too before the view appears
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"MySegue"]) {
// Get destination view
SecondView *vc = [segue destinationViewController];
// Get button tag number (or do whatever you need to do here, based on your object
NSInteger tagIndex = [(UIButton *)sender tag];
// Pass the information to your destination view
[vc setSelectedButton:tagIndex];
}
}
EDIT : 첨부한 데모 어플리케이션은 6년이 되었기 때문에 혼란을 피하기 위해 삭제했습니다.
경우에 따라서는 2개의 뷰 컨트롤러 간에 컴파일 시간 의존 관계가 생성되지 않도록 하는 것이 도움이 됩니다.다음은 대상 뷰 컨트롤러의 유형에 관계없이 수행할 수 있는 방법입니다.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.destinationViewController respondsToSelector:@selector(setMyData:)]) {
[segue.destinationViewController performSelector:@selector(setMyData:)
withObject:myData];
}
}
따라서 대상 뷰 컨트롤러가 다음과 같은 공용 속성을 선언하는 경우:
@property (nonatomic, strong) MyData *myData;
위에서 설명한 것처럼 이전 뷰 컨트롤러에서 이 속성을 설정할 수 있습니다.
Swift 4.2에서는 다음과 같은 작업을 수행합니다.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let yourVC = segue.destination as? YourViewController {
yourVC.yourData = self.someData
}
}
나는 이런 송신자 수업이 있다.
@class MyEntry;
@interface MySenderEntry : NSObject
@property (strong, nonatomic) MyEntry *entry;
@end
@implementation MySenderEntry
@end
오브젝트를 전달하기 위해 이 송신자 클래스를 사용합니다.prepareForSeque:sender:
-(void)didSelectItemAtIndexPath:(NSIndexPath*)indexPath
{
MySenderEntry *sender = [MySenderEntry new];
sender.entry = [_entries objectAtIndex:indexPath.row];
[self performSegueWithIdentifier:SEGUE_IDENTIFIER_SHOW_ENTRY sender:sender];
}
-(void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_SHOW_ENTRY]) {
NSAssert([sender isKindOfClass:[MySenderEntry class]], @"MySenderEntry");
MySenderEntry *senderEntry = (MySenderEntry*)sender;
MyEntry *entry = senderEntry.entry;
NSParameterAssert(entry);
[segue destinationViewController].delegate = self;
[segue destinationViewController].entry = entry;
return;
}
if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_HISTORY]) {
// ...
return;
}
if ([[segue identifier] isEqualToString:SEGUE_IDENTIFIER_FAVORITE]) {
// ...
return;
}
}
View Controller 간에 데이터를 전달하는 방법을 배우던 중 이 질문을 접하게 되었습니다.다만, 학습에 도움이 되는 시각적인 것이 필요하기 때문에, 이 대답은 이미 여기 있는 다른 사람들의 보충입니다.이것은 원래 질문보다 조금 더 일반적이지만, 작동하도록 조정될 수 있습니다.
다음의 기본적인 예는 다음과 같이 동작합니다.
첫 번째 뷰 컨트롤러의 텍스트 필드에서 두 번째 뷰 컨트롤러의 레이블로 문자열을 전달하는 방법입니다.
첫 번째 뷰 컨트롤러
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var textField: UITextField!
// This function is called before the segue
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// get a reference to the second view controller
let secondViewController = segue.destinationViewController as! SecondViewController
// set a variable in the second view controller with the String to pass
secondViewController.receivedString = textField.text!
}
}
세컨드 뷰 컨트롤러
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
// This variable will hold the data being passed from the First View Controller
var receivedString = ""
override func viewDidLoad() {
super.viewDidLoad()
// Used the text from the First View Controller to set the label
label.text = receivedString
}
}
잊지 말고
- 버튼을 클릭하여 Second View Controller로 드래그하여 segue를 만듭니다.
- 를
UITextField및UILabel. - 첫 번째 및 두 번째 View Controller를 IB에서 적절한 Swift 파일로 설정합니다.
원천
segue(스위프트)를 통한 데이터 전송 방법(YouTube 튜토리얼)
「 」를 참조해 주세요.
View 컨트롤러: 데이터 전송 및 데이터 전송(완전 답변)
Swift의 경우,
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
var segueID = segue.identifier
if(segueID! == "yourSegueName"){
var yourVC:YourViewController = segue.destinationViewController as YourViewController
yourVC.objectOnYourVC = setObjectValueHere!
}
}
UIViewController에 이 작업을 간소화하는 카테고리를 가진 라이브러리를 구현했습니다.기본적으로 segue를 수행하는 UI 항목에 연결된 NSDictionary에서 전달할 매개 변수를 설정합니다.수동 세그먼트에서도 사용할 수 있습니다.
예를 들어 다음과 같이 할 수 있습니다.
[self performSegueWithIdentifier:@"yourIdentifier" parameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];
수동 segue를 위해 또는 segue와 함께 버튼을 만들고 사용합니다.
[button setSegueParameters:@{@"customParam1":customValue1, @"customValue2":customValue2}];
수신처 뷰 컨트롤러가 키의 키 값 코딩에 준거하고 있지 않은 경우, 아무 일도 일어나지 않습니다.key-values 와도 동작합니다(unwind segues 에 도움이 됩니다).여기를 봐주세요.https://github.com/stefanomondino/SMQuickSegue
제 솔루션도 비슷합니다.
// In destination class:
var AddressString:String = String()
// In segue:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "seguetobiddetailpagefromleadbidder")
{
let secondViewController = segue.destinationViewController as! BidDetailPage
secondViewController.AddressString = pr.address as String
}
}
그냥 이 기능을 사용하세요.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let index = CategorytableView.indexPathForSelectedRow
let indexNumber = index?.row
let VC = segue.destination as! DestinationViewController
VC.value = self.data
}
segue 호출과 데이터 통신을 동일한 기능 내에서 유지하기 위해 이 솔루션을 사용했습니다.
private var segueCompletion : ((UIStoryboardSegue, Any?) -> Void)?
func performSegue(withIdentifier identifier: String, sender: Any?, completion: @escaping (UIStoryboardSegue, Any?) -> Void) {
self.segueCompletion = completion;
self.performSegue(withIdentifier: identifier, sender: sender);
self.segueCompletion = nil
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
self.segueCompletion?(segue, sender)
}
사용 사례는 다음과 같습니다.
func showData(id : Int){
someService.loadSomeData(id: id) {
data in
self.performSegue(withIdentifier: "showData", sender: self) {
storyboard, sender in
let dataView = storyboard.destination as! DataView
dataView.data = data
}
}
}
이것은 나에게 효과가 있는 것 같습니다만, 퍼포먼스와 준비 기능이 항상 같은 스레드에서 실행되는지는 100% 확신할 수 없습니다.
언급URL : https://stackoverflow.com/questions/7864371/how-to-pass-prepareforsegue-an-object
'programing' 카테고리의 다른 글
| 기능 프로그래밍의 '접기' 기능과 동등한 '피토닉'은 무엇입니까? (0) | 2023.04.10 |
|---|---|
| 문자열 앞에 $는 무엇을 의미합니까? (0) | 2023.04.10 |
| git 'pull request'를 'push request'라고 부르지 않는 이유는 무엇입니까? (0) | 2023.04.10 |
| 셸: 다른 셸 스크립트에서 셸 스크립트를 호출하려면 어떻게 해야 합니까? (0) | 2023.04.10 |
| VBA 함수에서 결과를 반환하는 방법 (0) | 2023.04.10 |
