Форум программистов, компьютерный форум CyberForum.ru

Создать метод - Objective-C

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
14.11.2012, 02:21     Создать метод #1
Под ночь не варит котелок уже, но мне всё интересно как реализовать 1 метод =) Есть файлик с настройками Settings.bundle В нём есть 2 текстовых поля, для которых заданы ключи "username" "password". Есть 2 филда для ввода логина и пароля "usernameField" "passwordField".
Есть кнопка для регистрации и для неё я хочу написать метод, который будет записывать логин и пасс из филдов в настройки для дальнейшего сравнения введённых данных при логине. Суть вопроса в том, что я не могу понять каким образом объявить метод, чтобы при последующем создании любого NSUserDefaults в мэйне я смог для него использовать данный метод. Я что-то недопонимаю, и получается только с созданием локальной памяти в самом методе =(
Objective-C
1
2
3
4
5
6
7
-(IBAction)registerNewUser; //регистрируем нового юзера
{
    NSUserDefaults *userData=[NSUserDefaults standardUserDefaults];
    [userData setObject:usernameField.text forKey:@"username"];
    [userData setObject:passwordField.text forKey:@"password"];
    [userData synchronize];
}
Данный метод соединен с кнопкой регистрации. Каким образом передать в этот метод можно абсолютно любой NSUserDefaults?

Добавлено через 13 минут
Можно как-то таким макаром метод сделать либо, чтобы метод возвращал базу, но как тогда сюда впендюрить, созданную базу в мэйне?
Objective-C
1
2
3
4
5
6
7
-(void)registerNewUser:(NSUserDefaults*)dataBase
{
    
    [dataBase setObject:usernameField.text forKey:@"username"];
    [dataBase setObject:passwordField.text forKey:@"password"];
    [dataBase synchronize];
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.11.2012, 02:21     Создать метод
Посмотрите здесь:

Objective-C Метод viewDidUnload
Метод allControlEvents класса UIControl Objective-C
ObjectiveC предикаты, упрощенный метод Objective-C
Требуется создать метод и там сложить 2 NSNumber Objective-C
Вызвать метод textFieldDidEndEditing? Objective-C
Objective-C Метод touchesBegan в UIViewController

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,268
14.11.2012, 02:22     Создать метод #2
вынести в отдельный метод
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
- (IBAction)registerNewUser;
{
    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [self synchronizeUserData:userData];
}
 
- (void)synchronizeUserData:(NSUserDefaults *)userData
{
    [userData setObject:usernameField.text forKey:@"username"];
    [userData setObject:passwordField.text forKey:@"password"];
    [userData synchronize];
}
но смысл этого, если NSUserDefaults являются статическими для всего приложения?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
14.11.2012, 09:51     Создать метод #3

Password в NSUserDefaults?
Используйте KeyChain.
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
14.11.2012, 10:15  [ТС]     Создать метод #4
Цитата Сообщение от Vorona Посмотреть сообщение
вынести в отдельный метод
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
- (IBAction)registerNewUser;
{
    NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
    [self synchronizeUserData:userData];
}
 
- (void)synchronizeUserData:(NSUserDefaults *)userData
{
    [userData setObject:usernameField.text forKey:@"username"];
    [userData setObject:passwordField.text forKey:@"password"];
    [userData synchronize];
}
но смысл этого, если NSUserDefaults являются статическими для всего приложения?
Наверное, Вы не так меня поняли. Вы переписали, то что написал я, только в 2 метода, и при этом первый метод registerNewUser по-прежнему создаёт хранилище для данных. А я хочу, чтобы он не создавал хранилище, а записывал в существующее, которое создаётся не в @implemеntation, а в моём main.m Или так не получится? А также я наверное в документации эппл профукал и недопонял про то, что данный класс NSUserDefaults является статическим, т.е его можно создать в любом методе новое хранилище и оно не будет локальным?

Добавлено через 22 минуты
Цитата Сообщение от zulkis Посмотреть сообщение

Password в NSUserDefaults?
Используйте KeyChain.
Мне надо разобраться с NSUserDefaults Потом разбираться буду с другими возможностями

И ещё хочу от одного нубского вопроса избавиться, который меня мучает
Есть main.m файл, а также некие newClass.h newClass.m. Переменные в хедере являются приватными ведь, т.е к ним доступ можно получить только через сет- и гет-методы? (так вроде и в с++, но вроде читал, что они публичны). Методы, объявленные в @implementation являются приватными? Т.е доступ извне будет только к тем методам, которые объявлены в хедере? И можно ведь не объявлять переменные, а сразу создавать свойства? (Вроде как работает всё при этом)(единственное сейчас не вспомню, нужны ли фигурные скобочки пустые) Вот пример (сейчас на работе не на чем компилить код, возможно допустил ошибки):
Objective-C
1
2
3
4
5
6
7
8
9
10
#import <UIKit/UIKit.h>
 
@interface newClass : NSObject
 
@property (nonatomic,retain) IBOutlet UIButton *registerButton;
@property (nonatomic,retain) IBOutlet UITextField *userName;
 
-(IBAction) registerNewUser;
 
@end
newClass.m
Objective-C
1
2
3
4
5
6
7
8
9
10
11
#import "newClass.h"
 
@implementation newClass
 
@synthesize registerButton, userName;
 
-(IBAction) registerNewUser
{//объявление метода
}
//и ещё кучка методов
@end
В результате в main.m с подключенным
Objective-C
1
#import "newClass.h"
я могу использовать registerButton, username, и метод регистрации? У меня почему-то пишет, что не объявлено ни метода, ни могу использовать эти аутлеты. Файлы лежат в разных папках, но в одном проекте, не могу понять почему такая несуразица возникает
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
14.11.2012, 15:21     Создать метод #5
Цитата Сообщение от Fooly Посмотреть сообщение
недопонял про то, что данный класс NSUserDefaults является статическим
С какого перепуга он статический? Класс то...

Цитата Сообщение от Vorona Посмотреть сообщение
- (IBAction)registerNewUser;
Данный метод ничего не создает. Он получает доступ к дефолтному файлу типа .plist настроек приложения(Он кстати расположен в Вашем приложении -> Library -> Preferences -> <YourBundleID>.plist). А затем вызывает другой метод передав туда этот NSUserDefaults.
Все. Ничего он не создает.

Далее:
Цитата Сообщение от Fooly Посмотреть сообщение
Мне надо разобраться с NSUserDefaults
А я не про то, с чем Вам нужно разбираться, я про то, что это в корне неверно.
Во-первых по причине необходимости скрытия данных(пароля).
Во-вторых по причине того, что .plist файлы, как и ассоциативные массивы(NSDictionary в Cocoa), являются хранилищем типа key-value, соответственно вы будете перетирать каждый раз данные о usename и password, если по этим ключам записывать разные данные.

Следующее:

Цитата Сообщение от Fooly Посмотреть сообщение
newClass.h newClass.m
Я уже не раз Вам гвоорил - прочтите хотябы 1 книгу. С интересом желательно. Избавитесь от кучи таких вопросов.

Цитата Сообщение от Fooly Посмотреть сообщение
Переменные в хедере являются приватными ведь
ivar - переменные ("переменные в хедере" - если я верно понял) - по умолчанию в интерфейсе protected.
Доступ можно получить очень многими способами в ObjC.
Не сравнивайте c++ и ObjC "на коленке" - читайте литературу.

Цитата Сообщение от Fooly Посмотреть сообщение
Т.е доступ извне будет только к тем методам, которые объявлены в хедере?
Нет, это всего лишь "область видимости". В ObjC нет понятия метод, но есть сообщение. Сообщение может быть послано кому угодно и неважно, знает ли тот, кто посылает сообщение о том, может ли принимаемый его принять.


Цитата Сообщение от Fooly Посмотреть сообщение
И можно ведь не объявлять переменные, а сразу создавать свойства? (Вроде как работает всё при этом)(единственное сейчас не вспомню, нужны ли фигурные скобочки пустые) Вот пример (сейчас на работе не на чем компилить код, возможно допустил ошибки):
Не сравнивайте ivar(переменные экземпляра объекта) с property(свойствами). Это разные вещи. Читайте литературу.
property в objc автоматически генерируют методы доступа (setters, getters) для ivar.



Цитата Сообщение от Fooly Посмотреть сообщение
я могу использовать registerButton, username, и метод регистрации? У меня почему-то пишет, что не объявлено ни метода, ни могу использовать эти аутлеты. Файлы лежат в разных папках, но в одном проекте, не могу понять почему такая несуразица возникает
Если честно, не понял в чем проблема.
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
14.11.2012, 16:03  [ТС]     Создать метод #6
Спасибо за ответ, мне легче получать ответы справшивая, а не читая =) Вы уж извините =)
Цитата Сообщение от zulkis Посмотреть сообщение
Данный метод ничего не создает. Он получает доступ к дефолтному файлу типа .plist настроек приложения(Он кстати расположен в Вашем приложении -> Library -> Preferences -> <YourBundleID>.plist). А затем вызывает другой метод передав туда этот NSUserDefaults.
Все. Ничего он не создает.
Я понял, т.е вызывая метод
Objective-C
1
-(IBAction) registerNewUser
, и создавая там новый NSUserDefaults, мне не важно, что он исчезнет после выполнения метода, т.к объявление локальное, но заносятся значения в файл, который сохраняет данные параметры на время существования программы, верно?
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
14.11.2012, 18:46     Создать метод #7
Цитата Сообщение от Fooly Посмотреть сообщение
, и создавая там новый NSUserDefault
Да чтож такое то...

Цитата Сообщение от zulkis Посмотреть сообщение
Данный метод ничего не создает
Еще раз: Данный метод НИЧЕГО не создает.
И в нем ничего не создается.
Это всего лишь указатель на существующий NSUserDefaults. Стандартный, он есть всегда. На уровне приложения.

Цитата Сообщение от Fooly Посмотреть сообщение
файл, который сохраняет
Файл ничего никогда НЕ сохраняет.
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,268
14.11.2012, 23:19     Создать метод #8
Цитата Сообщение от zulkis Посмотреть сообщение
недопонял про то, что данный класс NSUserDefaults является статическим
не класс статический, а юзердефолтс статические для всего приложения, просто есть и все, их не нужно создавать, к ним нужно обращаться и записывать в них
ладно, zulkis тут уже достаточно написал о "не создает" и "просто есть" ))
zulkis
 Аватар для zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
15.11.2012, 06:12     Создать метод #9
Цитата Сообщение от Vorona Посмотреть сообщение
Сообщение от zulkis
недопонял про то, что данный класс NSUserDefaults является статическим
Но-но-но, это не моя цитата, попрошу...
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
15.11.2012, 09:59  [ТС]     Создать метод #10
Цитата Сообщение от Vorona Посмотреть сообщение
не класс статический, а юзердефолтс статические для всего приложения, просто есть и все, их не нужно создавать, к ним нужно обращаться и записывать в них
ладно, zulkis тут уже достаточно написал о "не создает" и "просто есть" ))
Спасибо, я всё понял, и всё работает как надо =) Я немного не так выражаюсь иногда, когда пишу, и получается путаница как с классом, хотя я сразу понял про NSUserDefaults
Ещё раз спасибо zulkis и Vorona
Я понял, что нужно побольше читать, и я найду ответы на свои вопросы, но мне легче получить ответ здесь и сейчас, вместо того чтобы вопрос мучал меня и не давал сосредоточиться на другом Поэтому задам ещё раз вопрос, который был недопонят выше. Наверное он нубский, ну и ладно...
Допустим есть файлик newClass.h, в котором определено:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
#import <UIKit/UIKit.h>
@interface newClass : //(наследуемся тут)
{
UIButton *myButton;
IBOUtlet UILabel * myLabel;
}
 
@property (nonatomic,retain) UIButton *myButton;
@property (nonatomic,retain) IBOUtlet UILabel * myLabel;
 
@end
Далее подключаем newClass.h и через
Objective-C
1
@synthesize myButton,myLabel;
синтезируем свойства в @implementation

Есть файлик main.m, в который я подключаю newClass.h, но при этом в теле функции
Objective-C
1
2
3
int main(int argc, char *argv[])
{//объявление @autoreleasepool
}
При попытке задействовать myButton и myLabel, пишет, что не объявлены данные переменные. Где я затупил? Спасибо
Vorona
Peace 2 all shining faces
 Аватар для Vorona
661 / 523 / 44
Регистрация: 05.03.2010
Сообщений: 1,268
16.11.2012, 00:32     Создать метод #11

Не по теме:

Цитата Сообщение от zulkis Посмотреть сообщение
Но-но-но, это не моя цитата, попрошу...
ни в коем случае



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

Objective-C
1
2
3
4
5
6
7
8
9
int main(int argc, char *argv[])
{
    newClass *obj = [[newClass alloc] init];
    
    [obj.myButton doSomething];
    [obj.myLabel doSomething];
 
    [obj release];
}
Yandex
Объявления
16.11.2012, 00:32     Создать метод
Ответ Создать тему
Опции темы

Текущее время: 21:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru