Odpowiedz na ten temat
Pokaż wyniki od 1 do 6 z 6
  1. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #1

    Witam, głowię się nad problemem wczytywania obrazka i zastanawiam się czy można zrobić to w moim przypadku bez delegata, którego z tego co widzę muszę użyć i nie da się tego inaczej obejść, chyba że czegoś nie wiem.

    Wygląda to tak:

    ViewController.h
    Kod:
    // import Menu.h i MenuDelegate.h
    ViewController.m
    Kod:
    ....
    //gdzieś tam wyżej wywoływany jest obiekt Menu *menu posiadający funkcję library, która za pomocą delegata wywołuje funkcję menuLibrary w głównej klasie.
    
    -(void)menuLibrary {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
        picker.delegate = self;
        [self presentModalViewController:picker animated:YES];
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
        self.workingImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
        [self dismissModalViewControllerAnimated:YES];
    }

    Chodzi mi o to, że tylko UIViewController posiada metodę presentModalViewController, która jest niezbędna do otworzenia galerii zdjęć. Klasa Menu dziedziczy po UIScrollView więc nie mogę w niej użyć tej metody bo wyrzuci błąd.

    Moje pytanie: Czy jest to możliwe i jak odwołać się z poziomu klasy Menu do klasy, w której ten obiekt został stworzony?

    zamiast:
    Kod:
    [self presentModalViewController:picker...];
    moglbym miec:

    Kod:
    [klasaNadrzędna presentModalViewController:picker...];
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    



  2. Dołączył
    Dec 2010
    Skąd
    Kraków
    Postów
    18

    Cytuj | #2

    Cytat Napisał tmkszlc Zobacz post
    Moje pytanie: Czy jest to możliwe i jak odwołać się z poziomu klasy Menu do klasy, w której ten obiekt został stworzony?
    Jedno z prostych rozwiązań: klasa Menu implementuje konstruktor, który jako jeden z parametrów ma wskaźnik do obiektu tworzącego to Menu. W tym konstruktorze zapisujesz sobie referencję do "twórcy" np do @property.
    Komputer: Mac Mini, PC

  3. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #3

    @gzajac, mogę prosić o przykład kodu?
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    


  4. Dołączył
    Dec 2010
    Skąd
    Kraków
    Postów
    18

    Cytuj | #4

    Kod:
    W main.h:
    @property (nonatomic, assign) UIViewController *uvc; // dla iOS < 5
    @property (weak) UIViewController *uvc; // dla iOS >= 5
    
    -(void)initWithParentViewController:(UIViewController *)parentViewController;
    
    W main.c:
    @synthesize uvc;
    
    -(void)initWithParentViewController:(UIViewController *)parentViewController 
    {
       // tutaj wstawić wywołanie konstruktora klasy nadrzędnej, albo designated constructor'a
    
       self.uvc = parentViewController;
    }
    I później w kodzie wołasz np: [self.uvc presentModalViewControllericker animated:YES];

    Generalnie nie jest zalecane aby obiekty View używały bezpośrednio "swojego" UIViewController'a. Łamie to reguły schematu MVC (Model View Controller).

    ---------- Wpis dodano o 18:00 ---------- Poprzedni wpis dodano o 17:47 ----------

    A wygląda na to że da się to zrobić też tak (Twoja klasa Menu jest typu UIView czyli jest również typu UIResponder):
    Kod:
    UIViewController *uvc = [TwojaKlasaMenu nextResponder];
    Dokumentacja metody nextResponder mówi tak:
    The UIResponder class does not store or set the next responder automatically, instead returning nil by default. Subclasses must override this method to set the next responder. UIView implements this method by returning the UIViewController object that manages it (if it has one) or its superview (if it doesn’t); UIViewController implements the method by returning its view’s superview; UIWindow returns the application object, and UIApplication returns nil.
    Ostatnio edytowane przez gzajac ; 06.02.2012 o 16:48
    Komputer: Mac Mini, PC


  5. Dołączył
    Jul 2009
    Postów
    103

    Cytuj | #5

    Cześć, nie widzę całego twojego kodu, ale radziłbym to bardziej MVC-friendly zrobić. Nie wiem jaki jest twój przypadek, ale raczej taki kod poskładany i nie-składny to prędzej czy później stanie się trochę kłopotliwy.
    Komputer: 

  6. Avatar tmkszlc
    Dołączył
    Sep 2008
    Skąd
    Koszalin
    Postów
    947

    Cytuj | #6

    @gzajac, dzięki, ale coś z tym nextResponder nie działa, albo ja zwyczajnie nie rozumiem. ostatecznie zrobiłem to tak:

    Kod:
    menu.h
    zadeklarowalem obiekt UIViewController *uvc.
    
    menu.m
    -(void)library {
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
        picker.delegate = self;
    
        frame = [self frame];
        uvc = [[UIViewController alloc] init];
        [uvc setView:self];
        [uvc presentModalViewController:picker animated:YES];
    }
    
    - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
        self.workingImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
        self.workingImageZero = self.workingImage;
        
        [uvc dismissModalViewControllerAnimated:YES];
        self.frame = frame;
        [delegate setImageViewWithImage:workingImage];
        
        uvc = nil;
    }
    Nie wiem, na ile jest to poprawne i czy można zrobić to lepiej, ale na razie jest to zrobione najlepiej jak potrafię. I tak musiałem użyć jednego delegata bo jest on niezbędny do wysłania wczytanej grafiki do klasy nadrzędnej czyli klasy 'ViewController'. Działać działa, jest przejrzyściej niż wcześniej.

    @Wojtas1111111111 staram się, aby było to proste w późniejszych modyfikacjach.
    Komputer: MacBook Pro 17 2010 i7 Matt
    Telefon: iPhone 3G 16GB
    Odtwarzacz: iPhone 3G 16GB
    Tablet: The new iPad 32GB WiFi + 4G
    

Odpowiedz na ten temat