-
Список говнокодов пользователя QuickNick
Всего: 19
-
−107
- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
-(void) loadView
{
[super loadView];
// код, не относящийся к сути
picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
picker.tag = 1;
picker.delegate = self;
picker.dataSource = self;
picker.transform = CGAffineTransformRotate(picker.transform, M_PI/2);
picker.frame = CGRectMake(20.0, -2.0, 280.0, 162.0);
picker.backgroundColor = [UIColor clearColor];
[picker selectRow:BPM inComponent:0 animated:NO];
[drumView addSubview:picker];
// стопиццот строк рисования в коде
}
-(NSInteger) numberOfComponentsInPickerView:(UIPickerView*) pickerView;
{
return 1;
}
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component;
{
NSInteger res;
res = 221;
return res;
}
-(NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger) component;
{
NSString *res;
res = @"";
return res;
}
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 17.0;
}
-(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view
{
if (!wasCustomized)
[self customizePickerView:pickerView];
UIImageView *bg = [[UIImageView alloc] init];
bg.frame = CGRectMake(0, 0, 17, 39);
UIImage *img = [UIImage imageNamed:@"drum_cell.png"];
bg.image = img;
bg.transform = CGAffineTransformRotate(bg.transform, M_PI/2);
return [bg autorelease];
}
-(void) customizePickerView:(UIPickerView*)pickerView
{
[(UIView*)[pickerView.subviews objectAtIndex:0] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:1] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:3] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:4] setHidden:YES];
BOOL isIt3 = NO;
for (UIView *v in pickerView.subviews)
if (v.tag == 3)
{
isIt3 = YES;
break;
}
if (!isIt3)
{
// меняем третью view
UIImageView *sh = [[UIImageView alloc] init];
sh.tag = 3;
sh.image = [UIImage imageNamed:@"drum_bg_on.png"];
sh.transform = CGAffineTransformRotate(sh.transform, M_PI/2);
sh.frame = CGRectMake(22, 19, 34, 242);
[pickerView addSubview:sh];
[sh release];
}
BOOL isIt2 = NO;
for (UIView *v in [(UIView*)[pickerView.subviews objectAtIndex:2] subviews])
if (v.tag == 2)
{
isIt2 = YES;
break;
}
if (!isIt2)
{
UIImageView *bg1 = [[UIImageView alloc] init];
bg1.tag = 2;
bg1.image = [UIImage imageNamed:@"drum_cell_big.png"];
bg1.transform = CGAffineTransformRotate(bg1.transform, -M_PI / 2);
bg1.frame = CGRectMake(0, -223, 48, 340);
[(UIView *) [pickerView.subviews objectAtIndex:2] addSubview:bg1];
[bg1 release];
for (int i = 0; i <= 11; i++)
{
[(UIView *) [pickerView.subviews objectAtIndex:2] addSubview:[self customIV:(116.0 + i * 340)]];
}
}
}
-(UIImageView *) customIV:(float) yPosition
{
UIImageView *bg = [[UIImageView alloc] init];
bg.image = [UIImage imageNamed:@"drum_cell_big.png"];
bg.transform = CGAffineTransformRotate(bg.transform, -M_PI / 2);
bg.frame = CGRectMake(0, yPosition, 48, 340);
return [bg autorelease];
}
Кастомизация UIPickerView для получения горизонтального "барабана", который при скроллинге "стучит".
Ученица умудрилась получить задание по масштабированию этого говна на Айпад. Убили вместе неделю на увеличение этого пикервью (оно, сволочь такая, отказывалось принимать нужные нам размеры, в своем setFrame: обрезая их до стандартных). Нагородили кучу костылей с трансформами, меня это в конце концов достало, и я за 5-6 часов накатал решение с использованием UIScrollView.
Пояснения.
1) drum_cell.png - это маленькая секция барабана. Этим рисунком заполняются 221 ячейки пикервью. Но вот беда - когда скроллим до краев, то ячейки заканчиваются и видим только голый, не разбитый визуально на секции бэкграунд.
2)Именно для решения этой проблемы был использован drum_cell_big.png. Он состоял примерно из 20 drum_cell.png, и он клался под генерируемые ячейки на скроллвью ([pickerView.subviews objectAtIndex:2]).
За скобками остался запуск побочного треда, из которого проставлялись значения на вьюхи.
QuickNick,
23 Ноября 2012
-
−101
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
- (void) setSavedData:(NSMutableDictionary *) chordsSettings
{
if ([chordsSettings count])
{
currentVariationsIndex = [[chordsSettings valueForKey:@"currentVariationsIndex"] intValue];
pickerComponent0Row = [[chordsSettings valueForKey:@"pickerComponent0Row"] intValue];
pickerComponent1Row = [[chordsSettings valueForKey:@"pickerComponent1Row"] intValue];
canPlayString1 = [[chordsSettings valueForKey:@"canPlayString1"] boolValue];
canPlayString2 = [[chordsSettings valueForKey:@"canPlayString2"] boolValue];
canPlayString3 = [[chordsSettings valueForKey:@"canPlayString3"] boolValue];
canPlayString4 = [[chordsSettings valueForKey:@"canPlayString4"] boolValue];
canPlayString5 = [[chordsSettings valueForKey:@"canPlayString5"] boolValue];
canPlayString6 = [[chordsSettings valueForKey:@"canPlayString6"] boolValue];
lockedString1 = [[chordsSettings valueForKey:@"lockedString1"] boolValue];
lockedString2 = [[chordsSettings valueForKey:@"lockedString2"] boolValue];
lockedString3 = [[chordsSettings valueForKey:@"lockedString3"] boolValue];
lockedString4 = [[chordsSettings valueForKey:@"lockedString4"] boolValue];
lockedString5 = [[chordsSettings valueForKey:@"lockedString5"] boolValue];
lockedString6 = [[chordsSettings valueForKey:@"lockedString6"] boolValue];
chordPartOne = [[chordsSettings valueForKey:@"chordPart1"] retain];
chordPartTwo = [[chordsSettings valueForKey:@"chordPart2"] retain];
flag = [[chordsSettings objectForKey:@"notes"] boolValue];
}
else
{
canPlayString1 = canPlayString2 = canPlayString3 = canPlayString4 = canPlayString5 = canPlayString6 = YES;
lockedString1 = lockedString2 = lockedString3 = lockedString4 = lockedString5 = lockedString6 = NO;
pickerComponent0Row = pickerComponent1Row = 0;
currentVariationsIndex = 0;
chordPartOne = @"C";
chordPartTwo = @"";
flag = NO;
}
chordPartThree = @"";
}
Интересно, если б аффтару нужно было писать приложение не для 6-струнной гитары, а для 12-струнной гитары или даже для арфы, он бы и там упорно не использовал массивы?
QuickNick,
21 Ноября 2012
-
−110
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
-(void) setEditing:(BOOL)editing animated:(BOOL)animate
{
if (indexDeleting != nil)
{
[[self.tableView cellForRowAtIndexPath:indexDeleting] willTransitionToState:UITableViewCellStateDefaultMask];
// if ([self.parentView.delegate sortArrayCount] /*dict array count*/ && [self.parentView.delegate editArrayCount:indexP.section]/*[[[dictArray objectAtIndex:section] valueForKey:@"edit"] count]*/)
// {
// [self.parentView.delegate setDeleteFlag:indexP value:@"0"];
// }
}
indexDeleting = nil;
isDeleting = NO;
isEditing = editing;
[super setEditing:editing animated:animate];
if (self.tableView.editing == editing)
{
[self.tableView setEditing:!editing animated:NO];
}
[self.tableView setEditing:editing animated:animate];
[self.tableView reloadData];
}
По выражению парней, вынужденных поддерживать это месиво, "Это еще образец чистоты и элегантности".
QuickNick,
20 Ноября 2012
-
−100
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
-(void) pressed1st
{
if (loopSound)
{
[self stopAllSounds];
}
startLoopSoundS2 = NO;
startLoopSoundS3 = NO;
startLoopSoundS4 = NO;
startLoopSoundS5 = NO;
startLoopSoundS6 = NO;
noteS1_act.alpha = 1;
string1_act.alpha = 1;
noteS1_act.hidden = NO;
string1_act.hidden = NO;
if (!startLoopSoundS1)
{
[delegate playSoundByFret:currentSound.strings[1] onString:1 loop:loopSound];
if (loopSound)
startLoopSoundS1 = YES;
else
[self runAnimationForString:string1_act withNoteView:noteS1_act];
}
else
{
startLoopSoundS1 = NO;
[delegate stopSoundNote:1];
noteS1_act.hidden = YES;
string1_act.hidden = YES;
}
noteS2_act.hidden = YES;
string2_act.hidden = YES;
noteS3_act.hidden = YES;
string3_act.hidden = YES;
noteS4_act.hidden = YES;
string4_act.hidden = YES;
noteS5_act.hidden = YES;
string5_act.hidden = YES;
noteS6_act.hidden = YES;
string6_act.hidden = YES;
}
-(void) pressed2nd
{
if (loopSound)
{
[self stopAllSounds];
}
startLoopSoundS1 = NO;
startLoopSoundS3 = NO;
startLoopSoundS4 = NO;
startLoopSoundS5 = NO;
startLoopSoundS6 = NO;
noteS2_act.alpha = 1;
string2_act.alpha = 1;
noteS2_act.hidden = NO;
string2_act.hidden = NO;
if (!startLoopSoundS2)
{
[delegate playSoundByFret:currentSound.strings[2] onString:2 loop:loopSound];
if (loopSound)
startLoopSoundS2 = YES;
else
[self runAnimationForString:string2_act withNoteView:noteS2_act];
}
else
{
startLoopSoundS2 = NO;
[delegate stopSoundNote:2];
noteS2_act.hidden = YES;
string2_act.hidden = YES;
}
noteS1_act.hidden = YES;
string1_act.hidden = YES;
noteS3_act.hidden = YES;
string3_act.hidden = YES;
noteS4_act.hidden = YES;
string4_act.hidden = YES;
noteS5_act.hidden = YES;
string5_act.hidden = YES;
noteS6_act.hidden = YES;
string6_act.hidden = YES;
}
Всего 6 методов.
Творчество моего любимого автора.
QuickNick,
16 Октября 2012
-
−98
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
-(UIImage*) getImageForDigit:(int)value
{
UIImage *img = nil;
switch (value)
{
case -1:
{
img = [UIImage imageNamed:@"beat_0_off.png"];
break;
}
case 0:
{
img = [UIImage imageNamed:@"beat_0.png"];
break;
}
case 1:
{
img = [UIImage imageNamed:@"beat_1.png"];
break;
}
case 2:
{
img = [UIImage imageNamed:@"beat_2.png"];
break;
}
case 3:
{
img = [UIImage imageNamed:@"beat_3.png"];
break;
}
case 4:
{
img = [UIImage imageNamed:@"beat_4.png"];
break;
}
case 5:
{
img = [UIImage imageNamed:@"beat_5.png"];
break;
}
case 6:
{
img = [UIImage imageNamed:@"beat_6.png"];
break;
}
case 7:
{
img = [UIImage imageNamed:@"beat_7.png"];
break;
}
case 8:
{
img = [UIImage imageNamed:@"beat_8.png"];
break;
}
case 9:
{
img = [UIImage imageNamed:@"beat_9.png"];
break;
}
default:
{
break;
}
}
return img;
}
Ученица отрыла простановку цифр на "кагбэ жидкокристаллический" дисплей.
QuickNick,
06 Октября 2012
-
−107
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
int sortingFunctionForType2(SomeEntity *item1, SomeEntity *item2, void *context)
{
NSString *str1 = nil;
NSString *str2 = nil;
if ([[item1 version] intValue] >= 10)
{
str1 = [NSString stringWithFormat:@"9%@", [item1 version]];
}
else
{
str1 = [NSString stringWithFormat:@"%@", [item1 version]];
}
if ([[item2 version] intValue] >= 10)
{
str2 = [NSString stringWithFormat:@"9%@", [item2 version]];
}
else
{
str2 = [NSString stringWithFormat:@"%@", [item2 version]];
}
return [str1 compare:str2];
}
Пояснение. Парсится XMLка, строится объект SomeEntity, у него есть свойство NSString *version, которое, однако, всегда имеет вид @"1", @"2", ... @"20" и так далее.
То есть, вначале горе-программисту было впадлу при строительстве объекта делать setVersion: [[attributeDict objectForKey: @"version"] intValue];
Затем возникла задача - сравнить эти числовые значения. Но система упорно считает, что @"10" < @"9".
Поэтому была изобретена такая портянка.
Что этот человек в программировании забыл - сказать не могу.
QuickNick,
19 Мая 2012
-
−1065
- 1
@property (nonatomic, retain) NSString *totalCount;
Чуть глаза от такого не лопнули
QuickNick,
16 Мая 2012
-
+71
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
public class Pages extends TabActivity {
@Override
protected void onResume() {
super.onResume();
if (!loading) {
loading = true;
new EmptyThread().execute();
}
}
@Override
protected void onPause() {
Data.killNow = true;
super.onPause();
}
private class EmptyThread extends AsyncTask<Void, String, Void> {
@Override
protected void onPreExecute() {
Data.killNow = false;
}
@Override
protected Void doInBackground(Void... unused) {
while (!Data.killNow) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
return null;
}
@Override
protected void onPostExecute(Void unused) {
loading = false;
}
}
}
В продолжение предыдущей темы (http://govnokod.ru/9256): из-за столь вольного обращения с модификатором static и адского обращения с AsyncTask*ами программист нарвался на утечку памяти и AsyncTask*и у него прекратили запускаться (не факт, что из-за утечек, я их исходный код не смотрел). Выше вам был представлен костыль, благодаря которому асинхронки всё-таки запускались. Как - я так и не постиг.
Для справки - когда экран выходит на передний план, срабатывает onResume(), когда уходит с него - onPause().
QuickNick,
30 Января 2012
-
+68
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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
public class Pages extends TabActivity {
public static TabHost host;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
host = getTabHost();
// много говнокода
}
}
public class Table extends Activity {
//много говнокода
@Override
protected void onResume() {
super.onResume();
if (!loading) {
loading = true;
new MainTask().execute();
}
}
private class MainTask extends AsyncTask<Void, String, Void> {
//безумнейший парсинг в donInBackground()
@Override
protected void onPostExecute(Void unused) {
//разбираемся с тем, что пришло - для начала отлавливаем ошибки в парсере.
if (!timeOut) {
AlertDialog dlg = new AlertDialog.Builder(TableOfGroups.this).setTitle(Data.lowConnectionTitle)
.setMessage(Data.lowConnectionText).setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
loading = false;
if (!update) {
Pages.host.setCurrentTab(Data.savePageIndex - 1);
}
}
}).setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int whichButton) {
loading = false;
if (!update) {
Pages.host.setCurrentTab(Data.savePageIndex - 1);
}
}
}).create();
dlg.show();
if (!update)
return;
}
//ещё около 150 строк подобной ловли
}
}
}
Задача (Android): имеется активити со вкладками (Pages), внутри него - дочерние активити. Если в активити Table на 4-й вкладке происходит косяк, то нужно показать диалог и перепрыгнуть на 1-ю вкладку.
QuickNick,
30 Января 2012