programing

prespare For Segue 전달 방법: 객체

newnotes 2023. 4. 10. 22:13
반응형

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를 만듭니다.
  • UITextFieldUILabel.
  • 첫 번째 및 두 번째 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

반응형