Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Вызов метода Phonegapa с параметрами

Всем добрый день. Есть метод который используется в плагине Phonegap: -(void) GetSystemLng:(CDVInvokedUrlCommand*)command

При вызове из хтмл ему передают параметры которые обрабатываются: [command.arguments objectAtIndex:0]

ВОпрос: как его данный метод вызвать из наитивного кода, как правильно передать нужные мне параметры? Пробовал так:     


Код

Test* myScript = [[Test alloc] init]; //First, we create an instance of SomeScript
    [myScript GetSystemLng:@"sdsd"]; //Next, we send the loggedIn message to our new instance


но при обращении к [command.arguments objectAtIndex:0] вылетает ошибка: 

-[__NSCFConstantString arguments]: unrecognized selector sent to instance 0x1bcb94
2014-06-21 23:22:10.688 112.travel[6648:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString arguments]: unrecognized selector sent to instance 0x1bcb94'

Буду признателен за помощь! Заранее спасибо!
Ответ:
Всем добрый день. Есть метод который используется в плагине Phonegap: -(void) GetSystemLng:(CDVInvokedUrlCommand*)command

При вызове из хтмл ему передают параметры которые обрабатываются: [command.arguments objectAtIndex:0]

ВОпрос: как его данный метод вызвать из наитивного кода, как правильно передать нужные мне параметры? Пробовал так:     


Код

Test* myScript = [[Test alloc] init]; //First, we create an instance of SomeScript
    [myScript GetSystemLng:@"sdsd"]; //Next, we send the loggedIn message to our new instance


но при обращении к [command.arguments objectAtIndex:0] вылетает ошибка: 

-[__NSCFConstantString arguments]: unrecognized selector sent to instance 0x1bcb94
2014-06-21 23:22:10.688 112.travel[6648:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString arguments]: unrecognized selector sent to instance 0x1bcb94'

Буду признателен за помощь! Заранее спасибо!
Вопрос: Вызов метода из другого класса

Нужно вызвать метод myView.mOK из SOAPClient 

SOAPClient.h

Код

@interface SOAPClient : NSObject <NSXMLParserDelegate>
{
  SEL ok;
}

@property (nonatomic) SEL ok;
- (void) sendRequest;
@end


Код

@implementation INRSOAPClient
@synthesize ok;

-(void) sendRequest{
 [self performSelector:@selector(ok)]; // ошибок нет, но строка "selector exec" не выводится
}

@end



myView.m

Код

-(void) mOK
{
  NSLog(@"selector exec"); // 
}

-(IBAction)invokeService
{
    SOAPClient *soapClient = [[SOAPClient alloc] initWithMethod :@"dd" url:@"rr" text:@"8888"];
    
    soapClient.ok = @selector(mOK);
    [soapClient sendRequest];
}


Ответ:
Спасибо!
Вопрос: Не получается передать результат парсинга в другой контроллер

Здравствуйте. Поясните почему возникает такая ситуация. У меня есть класс наследник NSOperation. В этом классе происходит парсинг xml после того как он отпарсит то результативный массив (массив словарей) должен отправляться в tableView. В методе main (класса парсинга), в которой и происходит отправка результата, но она не срабатывает если нету NSLog. То есть если я перед отправкой проверяю (чисто для себя) есть там данные или нет то массив отправляется, но если я этот NSLog уберу то отправки не происходит, принимающий массив пуст и как результат в TableView ничего нету. Я не могу понять как NSLog может влиять на отправку? В feedArray должен передаться appRecordList.

Код где я запускаю этот парсинг:
Код Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
-(void)startingParse: (NSData*)data  {
    self.queue = [[NSOperationQueue alloc]init];
    
    
    VRParser *parser = [[VRParser alloc]init];
    parser.dataXml = data;
    NSLog(@"data %@", data);
    __weak VRParser *weakParser = parser;
    
    parser.completionBlock = ^{
        if (weakParser.appRecordList) {
            dispatch_async(dispatch_get_main_queue(), ^{
                
               
                VRRootViewController *rootViewController = (VRRootViewController*)[(UINavigationController*)self.window.rootViewController topViewController];
                
                
                rootViewController.feedsArray = weakParser.appRecordList;
                [rootViewController.tableView reloadData];
                
                
                
                NSLog(@"/n/n/n/HELLLO/n/n/n/n");
                NSLog(@"\n\n\n------------------\n");
                NSLog(@"Parse rootViewController feed = %@", rootViewController.feedsArray);
                NSLog(@"\n\n\n--------\nParse feed = %@", weakParser.appRecordList);
            });
        }
        self.queue = nil;
        
    };
    [self.queue addOperation:parser];
}
А это код самого парсинга

Код Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
//  VRParser.m
//  rssReader
//
//  Created by Admin on 06.01.15.
//  Copyright (c) 2015 admin. All rights reserved.
//
 
#import "VRParser.h"
 
@interface VRParser ()
{
    NSXMLParser* parser;
    NSMutableArray* feeds;
    NSMutableDictionary *item;
    NSMutableString* title;
    NSMutableString *pubDate;
    NSMutableString * author;
    NSMutableString *link;
    NSMutableString *description;
    NSString *element;
}
 
@end
 
 
 
@implementation VRParser
@synthesize feeds = _feeds;
-(void)main {
    _feeds = [[NSMutableArray alloc]init];
  //  NSURL *url = [NSURL URLWithString:
               //   @"http://rss.cbc.ca/lineup/topstories.xml"];
 
    
    parser = [[NSXMLParser alloc]initWithData:self.dataXml];
  
   
    [parser setDelegate:self];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];
    
    
    if (![self isCancelled])
    {
        // Set appRecordList to the result of our parsing
        self.appRecordList = self.feeds;
        NSLog(@"self.appRecordList %@",  self.appRecordList);
         }
 
    
    NSLog(@"VRParser  main");
}
 
 
#pragma mark - Parser
 
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    element = elementName;
    
    NSLog(@"VRParser  didStartElement");
    
    if ([element isEqualToString:@"item"]) {
        item = [[NSMutableDictionary alloc]init];
        title = [[NSMutableString alloc]init];
        link = [[NSMutableString alloc]init];
        pubDate = [[NSMutableString alloc]init];
        author = [[NSMutableString alloc]init];
        description = [[NSMutableString alloc]init];
    }
}
 
 
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
{dispatch_sync(dispatch_get_main_queue(), ^{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Error. Site url is crash" message:[parseError localizedDescription] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    
    [alert show];
     });
        NSLog(@"error %@", parseError);
 
}
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if ([[alertView buttonTitleAtIndex:buttonIndex]isEqualToString:@"Repeat"]) {
        
        [self main];
       
    }
}
 
 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    
    
    if ([elementName isEqualToString:@"item"]) {
        [item setObject:title forKey:@"title"];
        [item setObject:link forKey:@"link"];
        [item setObject:pubDate forKey:@"pubDate"];
        [item setObject:author forKey:@"author"];
        [item setObject:description forKey:@"description"];
        
        
        [_feeds addObject:[item copy]];
    }
}
 
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if ([element isEqualToString:@"title"]) {
        [title appendString:string];
    } else if ([element isEqualToString:@"link"]) {
        [link appendString:string];
    }
    
    else if ([element isEqualToString:@"pubDate"]) {
        [pubDate appendString:string];
    }
    else if ([element isEqualToString:@"author"]) {
        [author appendString:string];
    }
    else if ([element isEqualToString:@"description"]) {
        [description appendString:string];
    }
    
    
}
 
-(void)parserDidEndDocument:(NSXMLParser *)parser {
 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
 
    
    
}
 
 
 
 
@end
Ответ: Вот, пожалуйста
Код Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//
//  VRParser.h
//  rssReader
//
//  Created by Admin on 06.01.15.
//  Copyright (c) 2015 admin. All rights reserved.
//
 
#import <Foundation/Foundation.h>
 
@interface VRParser : NSOperation <NSXMLParserDelegate, UIAlertViewDelegate>
@property (strong, nonatomic) NSMutableArray* feeds;
 
 
@property (strong, nonatomic)NSArray* appRecordList;
 
@property (strong,nonatomic)NSData *dataXml;
 
@end
Вопрос: Как вызвать функцию другого окна

Как вызвать функцию одного ВьюКонтроллера, в другом ВьюКонтроллере?
Вопрос может быть глупым и банальным, но никак не могу разобраться. Я делаю, с помощью протокола и экстеншнов. Может что-то я делаю неправильно. Пожалуйста объясните.
Ответ:
Сообщение от Vorona
тут мне в голову могут прийти случаи child-parent отношений и передача управления при закрытии одного и открытии другого
Это безусловно. Может, я не до конца понимаю архитектуру озвученную просто. Делегирования, как правило, достаточно для реализации несложных вызовов.
Ибо вызов метода у стороннего VC это, как ни крути, нарушение инкапсуляции и повышение связности. От чего, как гласит великая мудрость, надо убегать.
Вопрос: Обновление одного контроллера другим

Здравствуйте, уважаемые коллеги!

Решил вот написать программу в OS X с "хорошо пахнущим кодом". Отделил бизнес-логику в отдельные классы, Core Data спрятал за Facade, сделал большой StoryBoard с отдельными ViewController-ами. Получилось вроде красиво.
Но вот незадача. Есть один контроллер который обслуживает список данных. Текущий объект списка хранится в Синглетоне бизнес-логики. Но как бы покрасивее заставить другой контроллер, описывающий View с деталями, обновиться, как только обновится этот самый текущий объект?

Заранее спасибо!
Ответ: у меня дежавю? или пару тем назад я видел ну в точности такой же вопрос?
Вопрос: Класс для выбора папки или файла на диске

Существует ли готовый класс для выбора папки или файла на диске?
Ответ:
Сообщение от AncientPenguin
В страшном сне не могу представить зачем в ios приложении такое диалоговое окно, видимо в наследство от мака досталось.
а тю, я про OS X и подумал, сорри

в iOS, конечно же, такого нету и быть не должно

во-первых в вашем распоряжении только папка Documents для вашего аппа, выше вы не можете подняться, остальные папки типа Library, tmp и все что в них лежит - не предназначено для постоянного хранения пользовательских файлов. А вот в Documents уже можно создавать свою иерархию, но все представления прийдется писать руками, хотя может где-то на есть какие-то решения

вот например такое
Вопрос: UIAlertViewDelegate clickedButtonAtIndex

Вопрос конечно детский, но я не понимаю =)) Вот объявление метода из протокола UIAlertViewDelegate
Код

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
}


почему оно такое странное? если рассматривать это как обычный метод класса, то получается, что возвращается void, название alertView, первый параметр UIAlertView, второй NSInteger. Но ведь это не так, потому что название метода clickedButtonAtIndex. А это магичесоке alertView в начале, что оно обозначает. Вроде читал про методы класса в инете, но так и не понял в чем тут магия 
Ответ:
Спасибо, кажется, я стал немного понимать. Очень смущало то, что в этом методе
Код

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
}

который подразумевает вызов при клике на кнопке само название идет как второй параметр. теперь я понимаю, что название это все вместе. Долгая работа с c++ действительно мешает, но именно по этой причине я решил взяться за другой язык (хотя бы немного похожий на с, чтобы было проще) представляю, что было бы, если взялся за какой-нибудь  haskell =))
Вопрос: Доступные всем статичные объекты

Как в ios реализовать подобное? Например, в java выглядит так:
Код Java(TM) 2 Platform Standard Edition 5.0
1
2
3
4
5
6
7
public class SomeClass{
    public static final int SOME_PARAM_1 = 0;
    public static final int SOME_PARAM_2 = 1;
}
 
//И дальше в любом месте в программе:
    int myParam = SomeClass.SOME_PARAM_1;
Есть ли что-то такое в objective-c? Или может там другими способами такое решается?

Добавлено через 4 часа 35 минут
Может не понятно объяснил - для примера, как решается ситуация, когда нужно послать в метод один из заранее определенных значений, день недели, к примеру? Причем чтобы эти параметры были доступны по всей программе, в любом классе. То есть, скажем, есть класс Calendar и у него метод setDayOfWeek, который принимает один из дней недели, а если параметр не соответствует дню недели - выбрасывает исключение.
Ответ: HellBoy4eG, ну здравствуйте, без инициализации... у синглтона уже есть инициализация...
Spelcrawler, так как Objective-C это Си в первую очередь, рассмотрите вариант использования extern в .h файле
Например так:
Код Objective-C
1
2
3
4
// .m file
NSString* const MyExternVar = @"MyExternVar";
// .h file
extern NSString* const MyExternVar;
Но если хочется сделать конкретно в классе - можете воспользоваться статичными методами, они объявляются через +
Код Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
@interface MyClass : NSObject
 
+ (NSString *)aClassMethod;
 
@end
 
@implementation MyClass : NSObject
 
+ (NSString *)aClassMethod {
    return @"TestString";
}
 
@end
Вопрос: Как отобразить связь между объектами MVC на UML

Вопрос о uml но я думаю скорее всего ближе ios программистам.
У нас есть 2 вьюКонтроллера и 1 класс с данными(назовем его MyData), типо модель, там хранятся данные и методы для их обработки что бы можно их было вызвать из любого вьюконтроллера. При запуске программы мы попадаем на первую вьюху и сразу создаем объект MyData, вызываем методы получаем результат и выводим на экран, потом переходим на 2 вьюконтроллер, передаем туда по сигвею этот же объект и опять вызываем метод и выводим результат. Вопрос в том какими стрелочками на юмл диаграмме соединить эти 3 класса? Как между собой взаимодейсвуют вьюконтролееры? Насколько я понимаю если бы никакие данные не передавались то никакой связи на диаграмме вообще не надо? а как в этом случае? и как называется связь в ходе которой мы просто вызываем методы и передаем данные для вычисления? это не композиция и не агрегация. да и ассоциация вроде когда есть логическая зависимость?

Это сообщение отредактировал(а) Rubio - 23.3.2014, 18:10
Ответ:
Вопрос о uml но я думаю скорее всего ближе ios программистам.
У нас есть 2 вьюКонтроллера и 1 класс с данными(назовем его MyData), типо модель, там хранятся данные и методы для их обработки что бы можно их было вызвать из любого вьюконтроллера. При запуске программы мы попадаем на первую вьюху и сразу создаем объект MyData, вызываем методы получаем результат и выводим на экран, потом переходим на 2 вьюконтроллер, передаем туда по сигвею этот же объект и опять вызываем метод и выводим результат. Вопрос в том какими стрелочками на юмл диаграмме соединить эти 3 класса? Как между собой взаимодейсвуют вьюконтролееры? Насколько я понимаю если бы никакие данные не передавались то никакой связи на диаграмме вообще не надо? а как в этом случае? и как называется связь в ходе которой мы просто вызываем методы и передаем данные для вычисления? это не композиция и не агрегация. да и ассоциация вроде когда есть логическая зависимость?

Это сообщение отредактировал(а) Rubio - 23.3.2014, 18:10
Вопрос: Два segue, Два viewController, Одно отображение

Добрый день! Изучаю работу c segue - и столкнулся с проблемой.

Какая стоит передо мной задача. Есть два класса (viewController), один наследуется от другого.
Отображение для них общее.

Мне нужно с главного отображения переходить на следующее отображение, но в зависимости от кнопки, выбирать для этого отображения конкретный класс

Если делать без storyboard - то все просто. Я создаю нужный мне viewController (initWithXibName) указывая свое отображение.

Здесь же я создал 2 segue - оба получается от соответствующих кнопок. Обе ведут на второе отображение. Но ведь в IB класс указан в настройках.

Я использую функцию prepareForSegue, но не пойму как изменить класс для этого отображения.

Это возможно? Хотелось бы использовать одно отображение, чтобы не плодить второе отображение (потому что просто два режима, просмотр записи, и добавление записи) - но хотелось бы два контроллера.

Спасибо!
Ответ: я утрировал) просто не понял Ваш вопрос, о том, зачем нужен еще один уровень наследования.

На самом деле, я изучаю(вспоминаю) objective-c пользуясь книгами (одна из них Head First) - ну так вот там был еще ios5. Я пытаюсь реализовать примеры из книги, но исползуя новые возможности, в данном случае SEGUE.

В книге используется простой прием. initWithXibName. Который позволяет загрузить любой VC с любым отображением. Здесь же так не получается - поэтому у меня появился этот вопрос)

Понятно, что есть другие пути решения, но хочется именно вникнуть, как все работает - и сделать так же как в книге, но другими методами